【发布时间】:2015-10-08 03:26:51
【问题描述】:
我想编写一个如下所示的函数:
template <typename CharT>
std::basic_string<CharT> convert(char const *);
并按如下方式使用:
convert<char>("Hello World!"); // "Hello World!"
convert<wchar_t>("Hello World!"); // L"Hello World!"
convert<char16_t>("Hello World!"); // u"Hello World!"
convert<char32_t>("Hello World!"); // U"Hello World!"
我可以使用 std::codecvt 和 co,但我发现它几乎毫无意义,因为使用一些添加 L、u 或 U 的宏会更容易,成本为 0。
不幸的是,模板和宏的作用不同......所以我的问题来了:有什么方法可以混合它们吗?还是有更好的办法?
我的主要目标是避免代码的重复(专业化):我正在编写的一些函数是 CharT 模板化并使用字符串文字,这将是唯一的区别。举个例子:
template <typename CharT>
void foo (std::vector<std::basic_string<CharT>> const & vec,
std::basic_string<CharT> str = convert<CharT>("default"));
这样可以避免为每个 char 类型专门化 foo()。
非常感谢您的帮助
【问题讨论】:
-
我认为这里不需要专业化,只需使用例如
codecvtchar作为“源”类型,CharT作为“目标”类型? -
确实,后来我已经在考虑了。已编辑,谢谢。
-
@JoachimPileborg 是的,但这仍然是运行时计算。 OP 希望避免这种情况,因为它们是字符串文字,添加某个前缀就可以了。
-
在那种情况下,宏不是唯一的方法吗?我不确定,但我认为宏连接运算符
##可以将前缀附加到字符串常量。除非这可以用operator""来完成?不过我对此表示怀疑。 -
在整个程序逻辑中仅使用一种类型的字符串文字(例如 u8"default")和一种类型的 std::basic_string(例如包含 utf8 的 std::string)。然后问题就不再存在了。
标签: c++ templates char wchar-t