是否可以创建用户定义的文字,将字符串文字转换为自己类型的数组?
假设我有一个自己的字节类型mylib::byte
:
namespace mylib {
enum class byte: unsigned char { };
}
例如,"Hello"_X
的类型应为mylib::byte[5]
,其值为{ 'H', 'e', 'l', 'l', 'o' }
。
这是背景,因此也许您可以推荐其他解决方案。
我有一个utf-8类,它存储一个mylib::byte *
和一个长度(这类似于std::string_view
,它不拥有存储区):
namespace mylib {
class utf8 {
const byte *m_string;
int m_length;
};
}
我希望能够方便地在代码中使用字符串文字构造mylib::utf8
,如下所示:
mylib::utf8 u = "Hello";
当前,我使用的是reinterpret_cast
,即UB:
namespace mylib {
class utf8 {
const byte *m_string;
int m_length;
public:
utf8(const byte *s) {
m_string = s;
m_length = ...;
}
utf8(const char *s) {
m_string = reinterpret_cast<const byte *>(s); // causes UB afterwards
m_length = ...;
}
};
}
所以我想,我想有这样的东西,以避免UB:
mylib::utf8 u = "Hello"_X; // I'd like to have the constructor with `const byte *` to be called here
注意:必须使用mylib::byte
,我不能更改它。
答案 0 :(得分:1)
mylib::utf8 operator "" _X(const char* c, std::size_t n) {
auto* r = new mylib::byte[n];
std::transform(c, c+n, r, [](auto c){ return (mylib::byte)(unsigned char)(c););
return {r,n};
}
这符合您所写的所有条件;您并不需要零泄漏。