我正在尝试编写模板化的容器类,该类将在内部使用字节数组(出于自定义分配的原因)。
类似这样的东西:
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)...)})
{}
//...
};