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

How to make an array's derived type accept aggregate initialization?

本文关键字:初始化 类型 何使 数组 派生      更新时间:2023-10-16

例如

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

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

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

您可以提供可变参数模板构造函数,如下所示:

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

现场演示

编辑:

以下版本也适用于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)...}) {}
};

现场演示

编辑:正如其他人在评论中指出的那样,这对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;
};

只需定义一个这样的构造函数:

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

例:

#include <array>
#include <iostream>
struct A : public std::array<int, 3>
{
    A(std::array<int, 3>    a) :
        std::array<int, 3>{a}
    {
    }
};
int main(void)
{
    A   a({1, 2, 3});
    std::cout << a[0] << "n";
    std::cout << a[1] << "n";
    std::cout << a[2] << "n";
}

这不是聚合初始化,而是"好像"...

相关文章: