所以我有一个程序(一个游戏),旨在通过键盘从人类获取输入。然而,希望在某些点上我控制远离用户并为他们做出某些决定。虽然可以编写特殊情况代码,以便在事件强制模拟用户输入的效果时使用,但我更倾向于覆盖输入流(在本例中为cin),以便程序实际上响应没有区别强迫决定,而不是用户自愿做出这样的决定。
我尝试过编写它就像输出流(例如cin<<'z'
)但是&lt;&lt; operator没有为cin定义,我不知道如何定义它。
写入键盘缓冲区会更好吗?如果是这样,我将如何以系统无关的方式做到这一点?
答案 0 :(得分:7)
写入输入是一个非常黑客。在实际输入(如cin
)和作用于该输入的游戏之间放置一个抽象层将是很多更清洁的设计。然后,您可以重新配置此抽象层以响应程序生成的命令,而不是在必要时响应cin
。
答案 1 :(得分:2)
您可以在std::cin
中插入streambuf,例如:
class InjectedData : public std::streambuf
{
std::istream* myOwner;
std::streambuf* mySavedStreambuf;
std::string myData;
public:
InjectedData( std::istream& stream, std::string const& data )
: myOwner( &stream )
, mySavedStreambuf( stream.rdbuf() )
, myData( data )
{
setg( myData.data(), myData.data(), myData.data() + myData.size() );
}
~InjectedData()
{
myOwner->rdbuf(mySavedStreambuf);
}
int underflow() override
{
myOwner->rdbuf(mySavedStreambuf);
return mySavedStreambuf->sgetc();
}
};
(我没有对此进行测试,因此可能存在错误。但基本的 原则应该有效。)
使用std::cin
作为参数构造此实例
将从data
返回字符,直到实例为止
被破坏,或者所有角色都被消耗掉了。
答案 2 :(得分:0)