您可以將流緩衝到std::cin
,是這樣的:
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();
}
};
(我沒有測試過這一點,所以可能會有誤差,但基本原則 笑。 ULD的工作。)
與std::cin
構建的這個實例作爲論據 將從data
返回字符,直到實例是 破壞,或所有字符都被消耗。
因此,將所有來自cin的輸入拉入具有自定義功能的緩衝區,然後將其作爲程序的輸入流進行操作?恐怕你沒有以我熟悉的方式使用「抽象層」。這聽起來像它會起作用,但是,謝謝! – Lurker 2014-10-31 09:29:26
@Lurker是的,類似的東西。或者有一個'InputSource'接口,一個用於'cin'的實現,一個用於「程序生成」,並在必要時切換這些接口 - 對'cin'的抽象。 – Angew 2014-10-31 09:41:22
@Lurker它被稱爲裝飾器,至少如果抽象模擬一個'std :: istream'。 (實際上,它是'std :: cin'使用的streambuf,你想要修飾它。) – 2014-10-31 09:57:44