我有一个typedef char char_t
,也可以是typedef wchar_t char_t
,我想要的是通用cout
。
我有一个util
命名空间我希望util::cout
如果std::cout
为char_t
则为char
,如果std::wcout
为char_t
则为wchar_t
{{1}}
答案 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()
将从文件中读取的字符串转换为多字节字符串。
基本上,字符串的格式没有关系,您可以随时随地更改它。