の基本的な文字列を初期化しますか?は、私は私のクラスのconstの基本的な文字列を持っているuint16_t
私が達成したい主な目標は、これらません:読める
- それがある場合(数字と「ポテト」からではなく、いくつかのバッファから変換しますなんとか)
- クロスプラットフォームのコード
- は文句を言わないコンパイラの警告を生成する...会社の方針
私はUSIですng C++ 11。
の基本的な文字列を初期化しますか?は、私は私のクラスのconstの基本的な文字列を持っているuint16_t
私が達成したい主な目標は、これらません:読める
私はUSIですng C++ 11。
どのように初期化すればよいですか?
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";
文字がその後に変換することができますあなたが必要とする(char16_t
から)uint16_t
こと:
uint16_t c = baz[0];
ユーザー定義サフィックスと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};
よりも、このアプローチにはこれ以上のオーバーヘッドはありませんどちらのアプローチでも、文字列を新しいヒープ割り当てにコピーする必要があるため、文字列リテラルから "標準" std::string
を作成しています。
const basic_stringの場合、コンパイル時にコンパイル時にオーバーヘッドが除去されませんか?演算子 "_u16はconstexprの権利ですか?" – cerkiewny
@cerkiewny理論的には、コンパイラは、文字列リテラルに文字列リテラルのポインタを置くことによって、文字列リテラルから 'const std :: string'の作成を最適化することができます - しかし、これは標準ライブラリの特別なサポートが必要です。 'std :: string'デストラクタが割り当てを' delete [] 'しようとしないようにします。私はそのような最適化を試みるコンパイラについても知らない。 – cdhowie
'basic_string'のメンバーの* none *は' constexpr'なので、演算子は 'constexpr'にすることはできません。 'basic_string'はヒープ割り当てを行いますが、コンパイル時に評価することはできません。 – cdhowie
'std :: vector'の代わりに' std :: basic_sting'を使う理由はありますか? – NathanOliver
はい、それは大きなコードベースで、私はそれを書いていない、この方法を維持する必要があります、以前の初期化は "\ 0P \ 0O \ 0t ..."文字列を基本文字列にキャストすることによって行われましたが、警告。 – cerkiewny
なぜ 'basic_string'? 'basic_string ' AKA 'u16string'を意味しますか? 'uint16_t'の配列が必要な場合は、' vector'または 'array'がはるかに適切です。 –
InternetAussie