我想编写一个看似如下的函数:
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()。
非常感谢你的帮助
答案 0 :(得分:0)
已编辑:此内容适用于C++11
。由于运算符不能是模板,因此您可以将运算符重载更改为convert
函数。
#include <string>
std::basic_string<char> operator ""_s(const char * str, std::size_t len) {
return std::basic_string<char> (str, str + len);
}
std::basic_string<char16_t> operator ""_u(const char * str, std::size_t len) {
return std::basic_string<char16_t> (str, str + len);
}
std::basic_string<char32_t> operator ""_U(const char * str, std::size_t len) {
return std::basic_string<char32_t> (str, str + len);
}
std::basic_string<wchar_t> operator ""_L(const char * str, std::size_t len) {
return std::basic_string<wchar_t> (str, str + len);
}
int main() {
std::string s1 = "Hello World!"_s;
std::u16string s2 = "Hello World!"_u;
std::u32string s3 = "Hello World!"_U;
std::wstring s4 = "Hello World!"_L;
return 0;
}
参见 LIVE DEMO 工作。
答案 1 :(得分:0)
我终于明白了使用宏来生成函数foo的每4个重载。
template <typename CharT>
void foo (std::vector<std::basic_string<CharT>> const & vec,
std::basic_string<CharT> str = convert<CharT>("default"));
成为
#define FOO(CharT, prefix) \
void foo (std::vector<std::basic_string<CharT>> const & vec, \
std::basic_string<CharT> str = prefix ## "default");
我只需要添加
FOO(char, )
FOO(wchar_t, L)
FOO(char16_t, u)
FOO(char32_t, U)
我还可以将四行放入另一个宏GENERATE,这样我就可以简单地调用
GENERATE(FOO)
我知道宏...但我已达到我的主要目标,以避免代码重复。 : - )
感谢大家的帮助!