如何在模板函数中使用 C++ 字符串文字?
How to have C++ string literals in template function?
有人可以帮我写这个函数,让它适用于宽字符和窄字符吗?我已经将一些字符串文字硬编码为窄字符(8 位)。
如何根据模板参数创建宽度中性字符串字面值?
template<typename OS, typename T1, typename T2>
OS& operator<<(OS& os, pair<T1,T2> p)
{
return os << "(" << p.first << "," << p.second << ")";
}
这适用于 clang++ V5.0.1 Clang & g++ 7.1:
cout << "pair{3.2, \"hello\"}=" << pair{3.2, "hello"} << endl;
我很惊讶。这也行,但它是标准和适当的吗?
wcout << L"wcout pair{3.2, \"hello\"}=" << pair{3.2, L"hello"} << endl;
谢谢
齐格弗里德
字符串文字的字符类型由文字左引号前指定的前缀(或缺少前缀)决定。您不能动态指定该前缀,因此字符串文字的类型不能基于模板。
但是,至少对于单个字符,您可以使用 std::basic_ios::widen()
方法在运行时将 char
转换为 ostream
指定的 CharT
类型(取决于流的当前语言环境),例如:
template<typename OS, typename T1, typename T2>
OS& operator<<(OS& os, const pair<T1,T2> &p)
{
return os << os.widen('(') << p.first << os.widen(',') << p.second << os.widen(')');
}
有人可以帮我写这个函数,让它适用于宽字符和窄字符吗?我已经将一些字符串文字硬编码为窄字符(8 位)。
如何根据模板参数创建宽度中性字符串字面值?
template<typename OS, typename T1, typename T2>
OS& operator<<(OS& os, pair<T1,T2> p)
{
return os << "(" << p.first << "," << p.second << ")";
}
这适用于 clang++ V5.0.1 Clang & g++ 7.1:
cout << "pair{3.2, \"hello\"}=" << pair{3.2, "hello"} << endl;
我很惊讶。这也行,但它是标准和适当的吗?
wcout << L"wcout pair{3.2, \"hello\"}=" << pair{3.2, L"hello"} << endl;
谢谢
齐格弗里德
字符串文字的字符类型由文字左引号前指定的前缀(或缺少前缀)决定。您不能动态指定该前缀,因此字符串文字的类型不能基于模板。
但是,至少对于单个字符,您可以使用 std::basic_ios::widen()
方法在运行时将 char
转换为 ostream
指定的 CharT
类型(取决于流的当前语言环境),例如:
template<typename OS, typename T1, typename T2>
OS& operator<<(OS& os, const pair<T1,T2> &p)
{
return os << os.widen('(') << p.first << os.widen(',') << p.second << os.widen(')');
}