我正在创建一个模板类,该模板类是某些数据类型的包装。我希望能够像设置未包装的数据一样设置/构造此类。
这是基本概念:
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
}