如何使数组的派生类型接受聚合初始化?
How to make an array's derived type accept aggregate initialization?
例如
class A : public std::array<int, 3>
{
};
和
A a{1, 2, 3}; // failed currently.
如何使数组的派生类型接受聚合初始化?
像这样定义一个构造函数:
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";
}
这不是聚合初始化,而是 "as if"...
编辑:正如其他人在评论中指出的那样,这对 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;
};
您可以提供可变参数模板构造函数,如下所示:
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)...}) {}
};
例如
class A : public std::array<int, 3>
{
};
和
A a{1, 2, 3}; // failed currently.
如何使数组的派生类型接受聚合初始化?
像这样定义一个构造函数:
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";
}
这不是聚合初始化,而是 "as if"...
编辑:正如其他人在评论中指出的那样,这对 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;
};
您可以提供可变参数模板构造函数,如下所示:
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)...}) {}
};