传递可变参数时在成员初始值设定项列表中进行转换

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_copystd::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)...)})
    {}

    //...

};