C++ 传递变量参数时强制转换成员初始值设定项列表
我正在尝试编写一个模板化容器类,它将在内部使用字节数组(出于自定义分配的原因) 大概是这样的:C++ 传递变量参数时强制转换成员初始值设定项列表,c++,templates,variadic-functions,C++,Templates,Variadic Functions,我正在尝试编写一个模板化容器类,它将在内部使用字节数组(出于自定义分配的原因) 大概是这样的: template<typename T, int size> class MyClass{ public: Byte internal_array[size * sizeof( T)]; MyClass() = default; //... }; //... MyClass<int, 20> container; 模板类MyClass{ 公
template<typename T, int size> class MyClass{
public:
Byte internal_array[size * sizeof( T)];
MyClass() = default;
//...
};
//...
MyClass<int, 20> container;
模板类MyClass{
公众:
字节内部数组[size*sizeof(T)];
MyClass()=默认值;
//...
};
//...
MyClass容器;
如果内部是一个普通数组,我可以添加一个允许使用列表初始化的构造函数
template <typename...Args>
MyClass(Args&&...args) : internal_array{ std::forward<Args>(args)...} {}
//...
MyClass<Byte, 2> container2 = { 1,2};
模板
MyClass(Args&&…Args):内部数组{std::forward(Args)…}{}
//...
MyClass container2={1,2};
但这只适用于字节。编译器接受以下内容,但给出垃圾结果:
MyClass<int, 2> container2 = { 1,2};
MyClass容器2={1,2};
我能否以某种方式强制转换/重新解释构造函数初始化中的内部数组或参数,使其按预期工作?使用
std::uninitialized\u copy
和std::initializer\u list
,您可以执行以下操作:
template<typename T, int size> class MyClass
{
public:
Byte internal_array[size * sizeof( T)];
MyClass(std::initializer_list<T> ini)
{
std::uninitialized_copy(ini.begin(),
ini.end(),
reinterpret_cast<T*>(internal_array));
}
template <typename ... Ts>
MyClass(Ts&& ... args) :
MyClass(std::initializer_list<T>{T(std::forward<Ts>(args)...)})
{}
//...
};
模板类MyClass
{
公众:
字节内部数组[size*sizeof(T)];
MyClass(标准::初始值设定项\u列表ini)
{
std::未初始化的_拷贝(ini.begin(),
ini.end(),
重新解释施法(内部数组);
}
样板
MyClass(Ts&…参数):
MyClass(std::initializer_list{T(std::forward(args)…)})
{}
//...
};
在元素上循环,并在字节数组中的正确“位置”放置新的位置?或者看看例如std::vector
是如何处理它的,因为它通常是以类似的方式实现的(但使用的是动态“数组”而不是固定大小的数组)。如果您的尝试对您无效,请提供。特别是,不要忽略诸如字节定义之类的细节。这很可能会影响你的结果,而你却没有意识到。可能会有帮助。@Jarod42谢谢!你知道如何在变量参数中使用它吗?它使用从变量参数构造std::initializer\u list
。