根据typedef可以是wcout的通用cout

时间:2012-08-15 09:37:48

标签: boost typedef boost-mpl c++

我有一个typedef char char_t,也可以是typedef wchar_t char_t,我想要的是通用cout
我有一个util命名空间我希望util::cout如果std::coutchar_t则为char,如果std::wcoutchar_t则为wchar_t {{1}}

3 个答案:

答案 0 :(得分:1)

你正在重塑一个可怕的(至少在这里,现在,也许这是一个很好的决定)MS设计。

请注意,每个其他平台最有可能使用UTF-8进行输出,因此通过std::cout的UTF-8字符串输出就可以了。在Windows上,无论如何都无法在控制台上输出Unicode输出(由于字体和破坏的控制台代码页)。

简而言之,没有理由这样的事情,你最好不要使用其中一个,而不是两个。

答案 1 :(得分:1)

是的,没问题;您可以使用模板专门化来保存对相应对象的static引用。

template<typename T> struct select_cout;

template<> struct select_cout<char> { static std::ostream &cout; };
std::ostream &select_cout<char>::cout = std::cout;

template<> struct select_cout<wchar_t> { static std::wostream &cout; };
std::wostream &select_cout<wchar_t>::cout = std::wcout;

std::basic_ostream<char_t> &cout = select_cout<char_t>::cout;

答案 2 :(得分:0)

如果您正在读取宽格式的文件并使用我从注释中提取的多字节程序,则可能是解决方案。 。

您可以将文件内容作为std::wstring读取到程序存储器中,并可以使用wcstombs_s()将从文件中读取的字符串转换为多字节字符串。

基本上,字符串的格式没有关系,您可以随时随地更改它。