質問

次のコンストラクターを含むクラスの表現型があります。

Phenotype(uint8 init[NUM_ITEMS]);

このような表現型を作成できます。

uint8 data[] = {0,0,0,0,0};
Phenotype p(data);

しかし、このようなものを作成しようとすると、エラーが発生します。

Phenotype p = {0,0,0,0,0};

出力:

$ make
g++ -Wall -g main.cpp -std=c++0x
main.cpp: In function ‘int main(int, char**)’:
main.cpp:109: error: no matching function for call to ‘Phenotype::Phenotype(<brace-enclosed initializer list>)’
main.cpp:37: note: candidates are: Phenotype::Phenotype(uint8*)

このエラーは、ブレースが描かれた初期イザーリストを取得するコンストラクターを定義する方法があることを示しているようです。誰かがこれがどのように行われるか知っていますか?

役に立ちましたか?

解決

集合体(配列と特定のクラス。一般的な信念に反して、これは多くの非ポッドでも機能します)についてのみ行うことができます。それらを取るコンストラクターを書くことは不可能です。

「c ++ 0x」としてタグ付けしたので、これは可能です。魔法の言葉は「Initializer-List Constructor」です。これは次のようになります

Phenotype(std::initializer_list<uint8> c) {
  assert(c.size() <= std::size(m_array));
  std::copy(c.begin(), c.end(), m_array);
}

// used like
Phenotype p1{1, 2, 3};
Phenotype p2({1, 3, 2}); // works too
Phenotype p3(1, 2, 3); // doesn't work

ただし、このような初期化はデフォルトの配列を構築し、割り当て演算子を使用します。速度と安全性を目指している場合(初期ザーが多すぎるためにタイムエラーをコンパイルします!)、バリアードテンプレートを備えた通常のコンストラクターを使用することもできます。

ただし、これは必要以上に一般的なものになる可能性があります(多くの場合、Initializer_Listでは、特にプレーン整数では完全に十分です)。それは完全な転送の恩恵を受けるので、rvalue引数を配列要素に構築することができます

template<typename ...T>
Phenotype(T&&...t):m_array{ std::forward<T>(t)... } {

}

// used like
Phenotype p1{1, 2, 3}; 
Phenotype p2(1, 2, 3); // works too
Phenotype p3({1, 2, 3}); // doesn't work   

難しい選択です!

編集 私たちがコンストラクターを作らなかったので、修正、最後のものも機能します explicit, 、したがって、のコピーコンストラクターを使用できます Phenotype, 、一時的な構築 Phenotype オブジェクトしてコピーします p3. 。しかし、それは私たちが本当に呼びかけたいと思うものではありません:)

他のヒント

C ++ 0xでは、このためのコンストラクターを作成できるようです。私はそれを自分で経験していませんが、それは呼ばれているように見えます Initializerリスト - 構築物.

コンテナは、このような初期化装リングコンストラクターを実装する場合があります。

template<class E> class vector {
public:
    vector (std::initializer_list<E> s) // initializer-list constructor
    {
        reserve(s.size());  // get the right amount of space
        uninitialized_copy(s.begin(), s.end(), elem);   // initialize elements (in elem[0:s.size()))
        sz = s.size();  // set vector size
    }

    // ... as before ...
};

STD :: hirtingizer_listテンプレートタイプを使用する必要があります。例:

#include <iostream>
class X {
    public:
        X (std::initializer_list<int> list) {
        for (auto i = list.begin(); i != list.end(); i++) {
                std::cout << *i << std::endl;
            }
        }
};


int main () {
    X x = {1,2,3,4,5};
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top