如何为用户定义的类型实现初始化列表?(类似于std :: vector初始化列表)

Kou*_*tty 15 c++ initializer-list c++11

std::vector 可以初始化为

std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 
Run Code Online (Sandbox Code Playgroud)

参考

现在,如果想要为我的某个类型实现类似的功能,我该如何去做呢?我该如何实现此功能的构造函数?

标准如何支持我实现这一目标(参考标准将是最有帮助的)?基本上,如果你可以教我如何实现std::vector它就足够了.

这可以在C++ 11之前完成吗?

另外,我可以使用POD结构类型初始化列表,以便我可以使用不同类型的值来初始化我的类型吗?

Yuu*_*shi 26

创建一个构造函数,该构造函数将a std::initializer_list作为参数:

#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};
}
Run Code Online (Sandbox Code Playgroud)

std::vector这几乎是完全相同的方式(尽管使用begin()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());
  }
Run Code Online (Sandbox Code Playgroud)

编辑:我不是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"};
}
Run Code Online (Sandbox Code Playgroud)

  • @Potatoswatter使用`public`成员变量,是的. (3认同)
  • 如果您希望列表初始化也可以使用零大小的初始化列表而不出所料,那么您还需要添加具有相应语义的默认构造函数.有关详细信息,请参阅http://akrzemi1.wordpress.com/2013/05/14/empty-list-initialization/ (2认同)