C++11 如何将具有var长度的编译时数组传递给构造函数?
我有以下代码:C++11 如何将具有var长度的编译时数组传递给构造函数?,c++11,visual-c++,C++11,Visual C++,我有以下代码: struct MyArrayEntry { int type; int id; }; template<size_t arraySize> struct MyArray { template<typename T, typename... Types> MyArray(T t, Types... ts) : data{ { t, ts... } } {} int dataSize = arraySize;
struct MyArrayEntry
{
int type;
int id;
};
template<size_t arraySize>
struct MyArray
{
template<typename T, typename... Types>
MyArray(T t, Types... ts) : data{ { t, ts... } } {}
int dataSize = arraySize;
MyArrayEntry data[arraySize];
};
void Blah()
{
static MyArray<3> kTest
(
{ 1, 4 },
{ 2, 5 },
{ 3, 6 }
);
}
struct MyArrayEntry
{
int型;
int-id;
};
模板
结构MyArray
{
模板
MyArray(T,类型…ts):数据{{T,ts..}{}
int dataSize=arraySize;
MyArrayEntry数据[阵列化];
};
废话
{
静态myktest数组
(
{ 1, 4 },
{ 2, 5 },
{ 3, 6 }
);
}
但这无法通过以下方式实现:
错误C2661:“MyArray::MyArray”:没有重载函数接受3
论据
我在这里做错了什么?根据您提供的信息,我建议使用a和a电话:
模板
结构MyArray
{
const int dataSize=arraySize;//也可以将其设置为常量
MyArrayEntry数据[阵列化];
MyArray(std::initializer\u列表元素)
{
std::copy(开始(元素)、结束(元素)、std::开始(数据));
}
};
创建为
MyArray<3> kTest({ { 1, 4 }, { 2, 5 }, { 3, 6 } });
MyArray-kTest({{1,4},{2,5},{3,6});
当然,这是一对额外的花括号,但它会使您的代码更简单。根据您提供的信息,我建议使用和调用:
模板
结构MyArray
{
const int dataSize=arraySize;//也可以将其设置为常量
MyArrayEntry数据[阵列化];
MyArray(std::initializer\u列表元素)
{
std::copy(开始(元素)、结束(元素)、std::开始(数据));
}
};
创建为
MyArray<3> kTest({ { 1, 4 }, { 2, 5 }, { 3, 6 } });
MyArray-kTest({{1,4},{2,5},{3,6});
当然,这是一对额外的花括号,但它会使您的代码更简单。为什么不使用MyArrayEntry?或者为什么不是一个或甚至?那么你的类就更简单了。我不想要向量,因为我想避免动态分配。至于数组,因为我有一个字段int dataSize=arraySize;如果你把数组大小作为模板参数,为什么还要把它作为成员变量呢?无论何时使用元素的数量,您都可以直接使用
arraySize
。或者在阵列上使用sizeof
运算符。或者,如果您使用std::array
,那么它也可以使用size()
成员函数。如果我们知道这个结构应该解决什么真正的问题,也许我们可以帮助您找到更好的解决方案?编译器不知道如何处理{1,4}
。它可能是为了初始化某种类型的对象,但它是什么类型的?它是为了与第三方C库进行互操作,我无法更改。因此,内存布局的大小必须为32位。然后是后面的32/32位对元素。为什么不使用MyArrayEntry?或者为什么不是一个或甚至?那么你的类就更简单了。我不想要向量,因为我想避免动态分配。至于数组,因为我有一个字段int dataSize=arraySize;如果你把数组大小作为模板参数,为什么还要把它作为成员变量呢?无论何时使用元素的数量,您都可以直接使用arraySize
。或者在阵列上使用sizeof
运算符。或者,如果您使用std::array
,那么它也可以使用size()
成员函数。如果我们知道这个结构应该解决什么真正的问题,也许我们可以帮助您找到更好的解决方案?编译器不知道如何处理{1,4}
。它可能是为了初始化某种类型的对象,但它是什么类型的?它是为了与第三方C库进行互操作,我无法更改。因此,内存布局的大小必须为32位。然后是后面的32/32位对元素。我一开始确实尝试了初始值设定项\u list-我没有意识到你必须复制数据,尽管这很糟糕。我试图把初始化列表直接传递到数据中,我一开始确实尝试了初始化列表,但我没有意识到你必须复制数据,尽管这很糟糕。我试图将初始值设定项列表直接传递到数据中