是否可以创建用户定义的文字,将字符串文字转换为自己类型的数组?

时间:2018-09-09 13:53:10

标签: c++ c++17 c++20

是否可以创建用户定义的文字,将字符串文字转换为自己类型的数组?

假设我有一个自己的字节类型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,我不能更改它。

1 个答案:

答案 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};
}

这符合您所写的所有条件;您并不需要零泄漏。