3

我有一个typedef char char_twhich 也可以typedef wchar_t char_t,我想要的是一个通用的cout.
我有一个util我想要的命名空间util::coutstd::cout如果char_tcharstd::wcout如果char_twchar_t

4

3 回答 3

2

是没有问题; 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;
于 2012-08-15T09:53:22.523 回答
1

您正在重新发明 MS 的一个糟糕的设计(至少在此时此地,也许这是一个不错的决定)。

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

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

于 2012-08-15T09:44:36.297 回答
0

如果您正在阅读宽格式文件并使用我从评论中挑选的多字节程序,那么解决方案可能是 . . .

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

本质上,字符串的格式并不重要,您可以随时根据需要更改它。

于 2018-09-24T16:08:54.393 回答