C++-用与被包装数据相同的语法构造包装类



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

以下是基本思想:

template<typename T> class WrapperClass{
public:
T data;
WrapperClass(const T& _data) : data( _data) {}
// others stuff
};

现在有了一个整数,我可以这样做:

WrapperClass<int> wrapped_data = 1;

但对于一个结构或类,我不知道如何:

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
}

最新更新