C++ 字符串文字-字符类型之间的模板转换

C++ 字符串文字-字符类型之间的模板转换,c++,templates,char,wchar-t,C++,Templates,Char,Wchar T,我想编写一个如下所示的函数: template <typename CharT> std::basic_string<CharT> convert(char const *); 这样可以避免为每个字符类型专门化foo() 非常感谢您的帮助编辑:这将在C++11中运行。由于运算符不能是模板,您可以将运算符重载更改为convert函数 #include <string> std::basic_string<char> operator ""_s(c

我想编写一个如下所示的函数:

template <typename CharT>
std::basic_string<CharT> convert(char const *);
这样可以避免为每个字符类型专门化foo()


非常感谢您的帮助

编辑:这将在
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;
}
#包括
std::基本字符串运算符“”(常量字符*str,std::大小字符串){
返回std::basic_字符串(str,str+len);
}
std::基本字符串运算符“”(常量字符*str,std::大小字符串){
返回std::basic_字符串(str,str+len);
}
std::基本字符串运算符“”(常量字符*str,std::大小字符串){
返回std::basic_字符串(str,str+len);
}
标准::基本字符串运算符“”\L(常量字符*str,标准::大小长度){
返回std::basic_字符串(str,str+len);
}
int main(){
std::string s1=“你好,世界!”\s;
std::u16string s2=“你好,世界!”\u;
std::u32string s3=“你好,世界!”\U;
std::wstring s4=“你好,世界!”\u L;
返回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;
}
#包括
std::基本字符串运算符“”(常量字符*str,std::大小字符串){
返回std::basic_字符串(str,str+len);
}
std::基本字符串运算符“”(常量字符*str,std::大小字符串){
返回std::basic_字符串(str,str+len);
}
std::基本字符串运算符“”(常量字符*str,std::大小字符串){
返回std::basic_字符串(str,str+len);
}
标准::基本字符串运算符“”\L(常量字符*str,标准::大小长度){
返回std::basic_字符串(str,str+len);
}
int main(){
std::string s1=“你好,世界!”\s;
std::u16string s2=“你好,世界!”\u;
std::u32string s3=“你好,世界!”\U;
std::wstring s4=“你好,世界!”\u L;
返回0;
}

请参阅工作。

我终于想到了使用宏每4次生成函数foo的重载

template <typename CharT>
void foo (std::vector<std::basic_string<CharT>> const & vec, 
          std::basic_string<CharT> str = convert<CharT>("default"));
我还可以将四行代码放入另一个宏中生成,这样我就可以简单地调用

GENERATE(FOO)
我知道宏。。。但我已经达到了避免代码重复的主要目标。:-)


谢谢大家的帮助

我终于想到了使用宏来生成foo函数的每4个重载

template <typename CharT>
void foo (std::vector<std::basic_string<CharT>> const & vec, 
          std::basic_string<CharT> str = convert<CharT>("default"));
我还可以将四行代码放入另一个宏中生成,这样我就可以简单地调用

GENERATE(FOO)
我知道宏。。。但我已经达到了避免代码重复的主要目标。:-)


谢谢大家的帮助

我不认为这里需要专门化,只使用
codevt
char
作为“源”类型,而
CharT
作为“目标”类型?事实上,我已经在考虑稍后的问题。编辑,谢谢。@JoachimPileborg是的,但那仍然是运行时计算。OP希望避免这种情况,因为它们是字符串文本,添加某个前缀就可以了。在这种情况下,宏不是唯一的方法吗?我不确定,但我认为宏串联运算符
##
可以将前缀附加到字符串常量。除非可以使用
运算符“
?但我对此表示怀疑。在整个程序逻辑中,只使用一种类型的字符串文字(例如u8“default”)和一种类型的std::basic_字符串(例如包含utf8的std::string)。然后问题就不再存在了。我不认为这里需要专门化,只使用
codevt
char
作为“源”类型,而
CharT
作为“目标”类型?事实上,我已经在考虑稍后的问题。编辑,谢谢。@JoachimPileborg是的,但那仍然是运行时计算。OP希望避免这种情况,因为它们是字符串文本,添加某个前缀就可以了。在这种情况下,宏不是唯一的方法吗?我不确定,但我认为宏串联运算符
##
可以将前缀附加到字符串常量。除非可以使用
运算符“
?但我对此表示怀疑。在整个程序逻辑中,只使用一种类型的字符串文字(例如u8“default”)和一种类型的std::basic_字符串(例如包含utf8的std::string)。然后问题就不存在了。谢谢你的回答,但我担心你需要在文本前面加上
L
u
u
(这正是我想要避免的)。这里您只生成std::basic_字符串。@JemCpp我不需要任何前缀,只需要后缀a
s
\u s
。看一看,参数是
char
wchar\u t
char16\u t
char32\u t
,而不仅仅是
char
。好的,您编辑的代码有所改进,但仍然存在一个问题:这不会产生相同的Xstring。比较一下
std::wstring(L“Jérémy”)
“Jérémy”
(请参阅)我可能会接受它,因为我很少使用重音符号或特定字符。谢谢你的回答,但恐怕你需要在文本前面加上
L
u
u
(正是我想要避免的)。这里您只生成std::basic\u字符串。@JemCpp我不需要任何前缀,只需要后缀a
s
\u s
。看一看,参数是
char
wchar\u t
char16\u t
char32\u t
,不仅仅是
char
。好的,您编辑的代码有了改进,但是我有一个问题:这不会产生相同的Xstring。比较一下
std::wstring(L“Jérémy”)
“Jérémy”(u L
)(请参见)我可能会适应它,因为我很少有机会使用重音或特定字符。
GENERATE(FOO)