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

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

我正在创建一个模板类,该模板类是某些数据类型的包装。我希望能够像设置未包装的数据一样设置/构造此类。

这是基本概念:

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

是否有办法以某种方式转发参数,以便我可以执行后一种语法而不会出错?

c++ templates constructor parameter-passing wrapper
1个回答
0
投票

包装器的问题在于它需要一个已构造的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
}
© www.soinside.com 2019 - 2024. All rights reserved.