C++ - 使用与包装数据相同的语法构造包装器 class

C++ - Constructing wrapper class with same syntax as wrapped data

我正在制作一个模板 class,它是某种数据类型的包装器。我希望能够设置/构造此 class 与我在未包装时设置该数据的方式相同。

基本思路如下:

template<typename T> class WrapperClass{

public:
    T data;

    WrapperClass(const T& _data) : data( _data) {}

    // others stuff

};

现在有了整数之类的东西,我可以这样做:

WrapperClass<int> wrapped_data = 1;

但是对于结构或 class 我不知道如何:

struct SomeStruct{

    int a, b, c;

    SomeStruct(int _a, int _b, int _c) {/*...*/}

};

//Would like to set the wrapped struct the same way as normal struct:
SomeStruct some_struct1 = { 1,2,3};
SomeStruct some_struct2( 1,2,3);

WrapperClass<SomeStruct> wrapped_struct1( {1,2,3}); //OK
WrapperClass<SomeStruct> wrapped_struct2 = {1,2,3}; //ERROR
WrapperClass<SomeStruct> wrapped_struct3( 1,2,3); //ERROR

有没有办法以某种方式转发参数,以便我可以在没有错误的情况下执行后一种语法?

你的包装器的问题是它需要一个已经构建好的 T。相反,您可以使用可变构造函数来接受构造 T:

所需的参数
#include <utility>

template<typename T> class WrapperClass{
public:
    T data;    
    template <typename...Args>
    WrapperClass(Args&&...args) : data(std::forward<Args>(args)...) {}
};

struct SomeStruct{    
    int a, b, c;    
    SomeStruct(int _a, int _b, int _c) : a(_a),b(_b),c(_c) {}   
};

int main() {
    WrapperClass<SomeStruct> wrapped_struct2{1,2,3};  // ok
    WrapperClass<SomeStruct> wrapped_struct3 = {1,2,3};  // ok
}