字符串字面值-字符类型之间的模板转换
string literal - template conversion between char types
我想编写一个函数,看起来像:
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,但我发现它几乎毫无意义,因为使用一些宏以0成本添加L
, u
或U
会更容易。
不幸的是,模板和宏在同一级别上不起作用…所以我的问题来了:有没有办法把和混合在一起呢?还是有更好的办法?
我的主要目标是避免代码的重复(专门化):我编写的一些函数是CharT
模板化的,并使用字符串字面量,这将是唯一的区别。例如:
template <typename CharT>
void foo (std::vector<std::basic_string<CharT>> const & vec,
std::basic_string<CharT> str = convert<CharT>("default"));
这样可以避免为每个char类型特化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;
}
见LIVE DEMO working
我终于有了使用宏来生成函数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)
我知道宏…但我已经达到了避免代码重复的主要目标。: -)
谢谢大家的帮助!
相关文章:
- 构造函数和转换运算符之间的重载解析
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在 Rcpp 中的字符串类型之间转换时出错
- 如何声明不同类型的模板化类之间的转换
- C 和 C++ 中的函数指针转换之间的差异
- 与浮点转换之间的规范化整数
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- C++ get 和类型转换之间的用法有什么区别?我应该使用哪一个?
- printf函数参数之间的序列点;转换之间的顺序点是否重要
- Clang和GCC中不明确基类转换之间的行为差异
- 转换之间的双和字节数组,为传输ZigBee API
- 隐式转换和显式转换之间的区别
- interpret_cast和C样式强制转换之间的区别是什么