如何使数组的派生类型接受聚合初始化?
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.
如何使数组的派生类型接受聚合初始化?
您可以提供可变参数模板构造函数,如下所示:
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";
}
这不是聚合初始化,而是"好像"...
相关文章:
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- 为什么我总是收到此错误:从类型为"农场动物"的右值初始化类型的非常量引用无效|
- 无法使用类型为"结构节点 *"的左值初始化类型为"结构节点 *"的参数
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 零初始化类型
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 类型值不能用于初始化类型实体
- 无效初始化类型的 BinaryNode *& 的非常量引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 无法汇总初始化类型结构的变量,其中包含在类模板中的位字段成员
- 直接或通过构造函数初始化类型的类
- 无法使用 'Shape *' 类型的左值初始化类型 'Shape Shape::*' 的返回对象
- C++:从类型"int*"的表达式初始化类型"const int*&"的引用无效
- 从类型为"矩阵"的右值初始化类型为"矩阵"的非常量引用无效
- 无法使用类型 'const char [X]' 的左值初始化类型 'const signed char *' 的成员子对象
- C 我可以用双重初始化类型浮点的变量
- 无法识别初始化类型