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

标签 c++ templates constructor parameter-passing wrapper

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

基本思想如下:

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
}

关于C++ - 使用与包装数据相同的语法构造包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58882466/

相关文章:

c++ - std::vector<T> 的字符串表示

C++ 模板 : correct way to return a new type

java - 有没有办法将自定义 html 模板添加到可与 JAvadoc.exe 一起使用的 Javadoc?

c++ - 是否可以在 C++0x 中使用 auto 执行以下操作?

c++ - 如何使用 PathCreateFromUrlA API

c++ - 类型 `Class Name` 不提供调用运算符(operator)。 C++

java - "The constructor is not visible"错误

C++ 默认构造函数

c++ - 'to_string' 不是 'std' 的成员

c++ - 如何围绕C 'class'概括此C++包装器?