string literal - char类型之间的模板转换

时间:2015-07-18 14:36:52

标签: c++ templates char wchar-t

我想编写一个看似如下的函数:

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,但我发现它几乎没有意义,因为使用添加LuU的宏会更容易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()。

非常感谢你的帮助

2 个答案:

答案 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)

我知道宏...但我已达到我的主要目标,以避免代码重复。 : - )

感谢大家的帮助!