17

std::vectorとして初期化できます

std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 

参照

私のタイプの1つで同様の機能を実現したい場合は、どうすればよいですか? この機能のコンストラクターはどのように実装すればよいですか?

これを達成するために、標準はどのようにサポートしてくれますか (標準への参照が最も役立ちます)。基本的には、実装方法を教えていただければstd::vector十分です。

これは C++11 より前でも実行できますか?

また、自分の型を初期化するために異なる型の値を持つことができるように、POD 構造体型初期化リストを使用できますか?

4

2 に答える 2

33

std::initializer_listパラメータとして aを取るコンストラクタを作成します。

#include <vector>
#include <initializer_list>

template <typename T>
struct foo
{
private:
    std::vector<T> vec;

public:

    foo(std::initializer_list<T> init) 
      : vec(init)
    { }
};


int main()
{
    foo<int> f {1, 2, 3, 4, 5};
}

std::vectorこれはほとんど同じ方法です (ただしbegin()、and end()-std::initializer_listは他のコンテナーとほぼ同じ方法でイテレーターを使用します)。からgcc:

  vector(initializer_list<value_type> __l,
     const allocator_type& __a = allocator_type())
  : _Base(__a)
  {
_M_range_initialize(__l.begin(), __l.end(),
            random_access_iterator_tag());
  }

編集:私はあなたがやろうとしていることを100%ではありませんが、均一な初期化を使用して必要なものを取得できる場合があります:

struct bar
{
private:

    int i;
    double j;
    std::string k;

public:

    bar(int i_, double j_, const std::string& k_)
      : i(i_), j(j_), k(k_)
    { }

};

int main()
{
    bar b {1, 2.0, "hi"};
}
于 2013-05-09T05:37:15.017 に答える
0

誰かがまだこの質問に対する別の回答を得ようとしている場合は、次のtypeidようなメリットを得ることができます。

template <typename Type>
void check_type( Type par ){
   if( typeid(Type) == typeid(std::string()) ) {} //check for string type
   if( typeid(Type) == typeid(int) ){} //is int

}
于 2020-06-19T08:19:04.253 に答える