根據特定的程序條件,我如何將std::ostream
綁定到std::cout
或std::ofstream
對象?雖然有很多原因無效,我想實現的東西,是語義上等效於以下內容:從std :: cout或std :: ofstream(文件)獲取std :: ostream
std::ostream out = condition ? &std::cout : std::ofstream(filename);
我見過一些例子,不是異常安全的,比如一個來自http://www2.roguewave.com/support/docs/sourcepro/edition9/html/stdlibug/34-2.html:
int main(int argc, char *argv[])
{
std::ostream* fp; //1
if (argc > 1)
fp = new std::ofstream(argv[1]); //2
else
fp = &std::cout //3
*fp << "Hello world!" << std::endl; //4
if (fp!=&std::cout)
delete fp;
}
有誰知道更好的例外安全解決方案嗎?
這似乎並不比任何更多的異常安全原始代碼。 – Brian 2008-12-22 20:46:20
是的。如果在處理(* fp <<「Hello World」<< std :: endl)時引發異常,則原始代碼會發生內存泄漏。 – Tom 2008-12-23 03:58:42
爲什麼這個答案得到我的投票是第一個答案打破了我的舊規則「不要惹別人的內部物體」。只是因爲你**可以**取代rdbuf並不意味着你應該。 – 2011-02-28 11:06:50