我正在尝试制作一个用于颜色的流操纵器,以用于输出到控制台。它可以改变文本和背景的颜色:
std::cout << ConColor::Color::FgBlue << 123 << "abc"; //text is blue, sticky
问题在于签名:
std::ostream &FgBlue(std::ostream &);
此签名也允许派生类,std::ostringstream
但无法更改字符串流的颜色。无论是否使用这样的参数调用该函数,该函数都会改变控制台的颜色。
因此,我想确保该论点类似于std::cout
,std::wcout
等。我希望它是通用的,以防std::ostream
在未来的标准中添加更多对象。
我尝试了很多涉及std::is_same
and的事情std::is_base_of
,当前者不起作用时,只是为了最终意识到这是没有意义的,因为任何继承自的参数类型std::basic_ostream<>
都将被转换为我在传递给函数时与之比较的类型,从而产生误报。
这最终使我得到了下面的答案(可变参数模板模板参数?哇,真是一口!)但是有几个问题:
- 编译器必须支持可变参数模板。我更喜欢 MSVC 上的解决方案。
- 如果使用具有不同数量的模板参数(例如
std::ostringstream
,它有 3 个而不是 2 个)的派生类,编译器会给出神秘的错误,因为它没有通过函数签名。 - 例如,可以将 stdout 重定向到文件,因此即使参数是
std::cout
,也会发生与 stringstream 情况相同的事情。
我鼓励人们发布任何其他解决方案,希望比我的更好,并且真的希望至少可以与 VS11 一起使用。