2017-07-18 9 views
1

所定のstd :: byte値でコンテナを初期化する正しい方法はありますか?std :: byteのコンテナを初期化する正しい方法

列挙のstd ::バイトの配列結果の

std::array<std::byte, 2> arr{0x36, 0xd0}はX

とコンパイラエラーの整数値を表すために一定していません。ベクトルとイニシャライザのリストも無駄です。

std :: vectorはstd :: copyであり、実際にこれを処理する意図がありますか?

+0

をのstd ::バイト{N} 、C++ 17のリラックスしたenumクラスの初期化ルールのためです。 http://en.cppreference.com/w/cpp/types/byte –

+0

OK、私はこれを知っており、この例では完全に問題ありません。しかし、20の価値観は、面倒です。本当に良い方法はありませんか? – Dassem

+1

興味深いことに、なぜ、unsigned charというよりstd :: byteを使いたいのですか? –

答えて

7

std::byte{0x36}は、intからenum classへの暗黙的な変換がないため、書く必要があります。あなたは一つ一つの時間をstd::byte書きたくない場合は

std::array<std::byte, 2> arr = {std::byte{0x36}, std::byte{0xd0}}; 

、ヘルパー関数の書き込み:使用して数値nはバイト値に変換することができ

template<typename... Ts> 
std::array<std::byte, sizeof...(Ts)> make_bytes(Ts&&... args) noexcept { 
    return{std::byte{std::forward<Ts>(args)}...}; 
} 

auto arr = make_bytes(0x36, 0xd0); 
+0

完璧な、ちょうど私が探していたもの。ありがとう。 – Dassem

+4

すべてがchar/unsigned charであることを知っていれば、完璧な転送は本当に必要ありません:) – Barry

+0

私はめったに期待していなかったので、自分の答えを投稿しようとしていました。 'std :: array arr { {0x36}、{0xd0}}; 'も働く(Spoiler:そうではありません)。私は、イニシャライザリストと集約初期化の間に、不一致をもう少し解消する必要があると思います。 –

関連する問題