如何使数组的派生类型接受聚合初始化?

时间:2016-06-14 09:47:50

标签: c++ c++11 initialization stdarray

例如

class A : public std::array<int, 3>
{
};

并且

A a{1, 2, 3}; // failed currently.

如何使数组的派生类型接受聚合初始化?

3 个答案:

答案 0 :(得分:7)

您可以按如下方式提供可变参数模板构造函数:

class A : public std::array<int, 3> {
public:
  template<typename... Args> constexpr A(Args&& ...args) 
    : std::array<int, 3>{{std::forward<Args>(args)...}} {}
};

Live Demo

编辑:

以下版本也适用于Visual Studio:

class A : public std::array<int, 3> {
public:
    template<typename... Args> constexpr A(Args&& ...args) 
      : std::array<int, 3>(std::array<int,3>{std::forward<Args>(args)...}) {}
};

Live Demo

答案 1 :(得分:1)

编辑:正如其他人在评论中指出的那样,std::array不会起作用,因为std::array并不包含构造函数initializer_list。但是对于具有initializer_list构造函数的其他容器,它可能很有用,例如std::vector

您可以使用继承构造函数(自C ++ 11开始):

class A: public std::vector<int,3>
{
      using std::vector<int,3>::vector;
};

答案 2 :(得分:0)

只需定义一个类似的构造函数:

CallingMethod()

示例:

A(std::array<int, 3>);

这不是聚合初始化,而是&#34;好像&#34; ...