传递可变参数时在成员初始值设定项列表中铸造

问题描述 投票:0回答:1

我正在尝试编写模板化的容器类,该类将在内部使用字节数组(出于自定义分配的原因)。

类似这样的东西:

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};

我可以以某种方式强制转换/重新解释内部数组或构造函数初始化中的参数,使其按预期工作吗?

c++ templates variadic-functions
1个回答
1
投票

使用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)...)})
    {}

    //...

};
© www.soinside.com 2019 - 2024. All rights reserved.