0

たとえば、次のコードがあります。

#include <iostream>
#include <array>

class Base {
public:
  Base() : mA(std::array<int,2>()) {}
  Base(std::array<int,2> arr) : mA(arr) {}
  Base(/* what to write here ??? */);
private:
  std::array<int,2> mA;
};

int main() 
{
    std::array<int,2> a = {423, 12}; // Works fine
    Base b(a); // Works fine
    Base c({10, 20}); // This is what I need. 

    return 0;
}

上記の「main」内の3行目に示されているように、初期化を許可するコンストラクターをどのように定義する必要がありますか?一般に、{1、2、3}、(1、2、3)などの数値のリスト、または要素を必要とせずに類似したもので初期化できる、構成可能な(コンパイル/実行時の長さの)構造が必要です。要素ごとのコピー。簡単にするためにstd::arrayを選択しましたが、この種の初期化では機能しない可能性があります。どのコンテナをお勧めしますか?

ありがとう、Kostya

4

1 に答える 1

5

std::initializer_list<int>を取り、その内容を配列にコピーするコンストラクターを追加できます。

#include <initializer_list>
#include <algorithm>

....

Base(std::initializer_list<int> a) {
   // check size first
   std::copy(a.begin(), a.end(), mA.begin()); }
}

注:実行時に定義された多数の要素を保持する場合std::vector<int>は、次を使用する必要があります。これにはコンストラクターが含まれinitializer_list<int>ているため、コードは単純です。

class Foo {
public:
  Foo() {}
  Foo(const std::vector<int>& arr) : mA(arr) {}
  Foo(std::initializer_list<int> a) : mA(a) {}
private:
  std::vector<int> mA;
};

次のように初期化できます。

Foo f1({1,2,3,4,5});

また

Foo f2{1,2,3,4,5};
于 2012-11-07T09:12:14.123 に答える