提问者:小点点

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


std::vector可以初始化为

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

参考

现在,如果想要实现类似的功能为我的类型之一,我如何去做它? 我应该如何实现此功能的构造函数?。

标准是如何支持我实现这一点的(参考标准将是最有帮助的)?。 基本上,如果您能教我如何为std::vector实现它,就足够了。

在C++11之前也可以这样做吗?

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


共1个答案

匿名用户

创建一个将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};
}

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());
  }

编辑:我不是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"};
}