传递可变参数时在成员初始值设定项列表中进行转换
Casting in member initializer list when passing variadic arguments
我正在尝试编写一个模板化容器 class,它将在内部使用一个字节数组(出于自定义分配的原因)。
像这样:
template<typename T, int size> class MyClass{
public:
Byte internal_array[size * sizeof( T)];
MyClass() = default;
//...
};
//...
MyClass<int, 20> container;
如果内部数组是普通数组,我可以添加一个允许使用列表初始化的构造函数。
template <typename...Args>
MyClass(Args&&...args) : internal_array{ std::forward<Args>(args)...} {}
//...
MyClass<Byte, 2> container2 = { 1,2};
虽然这只适用于字节。以下内容被编译器接受但给出了垃圾结果:
MyClass<int, 2> container2 = { 1,2};
我能否以某种方式转换/重新解释构造函数初始化中的内部数组或参数,使其按预期工作?
使用 std::uninitialized_copy
和 std::initializer_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)...)})
{}
//...
};
我正在尝试编写一个模板化容器 class,它将在内部使用一个字节数组(出于自定义分配的原因)。
像这样:
template<typename T, int size> class MyClass{
public:
Byte internal_array[size * sizeof( T)];
MyClass() = default;
//...
};
//...
MyClass<int, 20> container;
如果内部数组是普通数组,我可以添加一个允许使用列表初始化的构造函数。
template <typename...Args>
MyClass(Args&&...args) : internal_array{ std::forward<Args>(args)...} {}
//...
MyClass<Byte, 2> container2 = { 1,2};
虽然这只适用于字节。以下内容被编译器接受但给出了垃圾结果:
MyClass<int, 2> container2 = { 1,2};
我能否以某种方式转换/重新解释构造函数初始化中的内部数组或参数,使其按预期工作?
使用 std::uninitialized_copy
和 std::initializer_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)...)})
{}
//...
};