初始化uint16_t的基本字符串

时间:2017-05-22 15:12:58

标签: c++ c++11

我班上有一个const基本字符串:

class foo {
   const basic_string<uint16_t> baz;
};

如何初始化它?

我想要实现的主要目标是:

  • 创作没有开销
  • 对用户可读,例如转换为&#34; Potato&#34;而不是从带有数字的缓冲区(如果可行)
  • 跨平台代码
  • 不会生成编译器警告...公司政策

我正在使用c ++ 11。

2 个答案:

答案 0 :(得分:2)

  

如何初始化它?

使用任何basic_string构造函数。在您的示例中,您使用了默认构造函数。以下是使用初始化列表的示例:

const basic_string<uint16_t> baz {
   uint16_t(u't'),
   uint16_t(u'e'),
   uint16_t(u's'),
   uint16_t(u't'),
};

我怀疑使用std::u16string会更容易:

const std::u16string baz = u"test";

以后可以在需要时将字符转换为uint16_t(来自char16_t):

uint16_t c = baz[0];

答案 1 :(得分:2)

您可以将UTF-16文字(u前缀)与用户定义的后缀组合使用:

std::basic_string<uint16_t> operator "" _u16(char16_t const *begin, std::size_t len)
{
    std::basic_string<uint16_t> str;

    if (begin != nullptr && len != 0) {
        char16_t const *end = begin + len;

        str.reserve(len);

        std::copy(begin, end, std::back_inserter(str));
    }

    return str;
}

现在您可以像这样初始化字符串:

std::basic_string<uint16_t> str{u"testing"_u16};

这种方法没有比创建&#34;标准&#34;更多的开销。来自字符串文字的std::string,因为在任何一种方法中,必须将字符串复制到新的堆分配中。