如何在模板函数中使用C ++字符串文字?

时间:2018-08-20 01:19:08

标签: c++ string-literals

有人可以帮我编写此功能,使其适用于宽字符和窄字符吗?我已经将一些字符串文字硬编码为窄字符(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;

谢谢

齐格弗里德

1 个答案:

答案 0 :(得分:1)

字符串文字的字符类型由文字开头引号前面指定的前缀(或缺少前缀)确定。您不能动态指定该前缀,因此字符串文字的类型不能基于模板。

但是,至少对于单个字符,可以在运行时使用here方法将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(')');
}