我正在制作一个模板类,它是某种类型数据的包装器。我希望能够像在数据未封装时设置/构造此类一样设置/构造该类。
以下是基本思想:
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
}