私は配列を保持するstruct
を持っていて、配列に転送される構造体のコンストラクタに初期化子リストを渡したいと思います。イニシャライザリストを持つメンバ配列を初期化する正しい方法は何ですか?
#include <initializer_list>
struct Vector
{
float v[3];
Vector(std::initializer_list<float> values) : v{values} {}
};
int main()
{
Vector v = {1, 2, 3};
}
Which resulted in the error:v
ため
error: cannot convert ‘std::initializer_list<float>’ to ‘float’ in initialization
I tried using parentheses instead of bracesをそれがエラーを与えた:説明するために、私が試した
error: incompatible types in assignment of ‘std::initializer_list<float>’ to ‘float [3]’
これを実行しようとするための私の主な動機は回避することですclangが生成するという警告に次のようになります。
template <int N>
struct Vector
{
float v[N];
};
template <>
struct Vector<2>
{
float x, y;
};
int main()
{
Vector<2> v2 = {1.0f, 2.0f}; // Yay, works
Vector<3> v3 = {1.0f, 2.0f, 3.0f}; // Results in warning in clang++
Vector<3> u3 = {{1.0f, 2.0f, 3.0f}}; // Must use two braces to avoid warning
// If I could make Vector<N> take an initializer list in its constructor, I
// could forward that on to the member array and avoid using the double braces
}
私の質問はです。どのように初期化リストを使ってメンバー配列を初期化できますか?あなたのクラスがaggregateある場合(つまり、どのように私は?最初のコードの仕事をしたり、それは不可能ですか?
集約の場合、ctorは必要ありません。 'initializer_list'のサイズは可変であることに注意してください。 'initializer-list'で初期化することと、_list-initialization_(これは言語構成であり、initializer-listを使ってctorを呼び出すことにつながる可能性があります)との違いもあります。 – dyp
実際にはできませんが、代わりに 'std :: array'を使用できますか? – juanchopanza
彼はstd :: arrayを使うことができましたが、標準ライブラリではなく、言語に関する質問としてこれを読んでいます。そして、誰かを正当に尊重して、誰かに標準ライブラリを読むように言うことは、シェイクスピアを読んで幼児に英語を学ばせるようなものです。だからstd :: arrayは非常に良い答えではありません。 –