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我不需要任何前缀,只需要后缀as
或\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我不需要任何前缀,只需要后缀as
或\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)