2

I'm making a template class that is a wrapper around some type of data. I would like to be able to set / construct this class the same way as I set that data when it's not wrapped.

Here's the basic idea:

template<typename T> class WrapperClass{

public:
    T data;

    WrapperClass(const T& _data) : data( _data) {}

    // others stuff

};

Now with something like an integer, I can do this:

WrapperClass<int> wrapped_data = 1;

But with a struct or class I don't know how:

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

Is there a way to somehow forward the parameters so I can do that latter syntax without an error?

Newline
  • 769
  • 3
  • 12

1 Answers1

3

The problem with your wrapper is that it requires an already constructed T. Instead you can use a variadic constructor to accept the parameters needed to construct a 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
}
463035818_is_not_an_ai
  • 109,796
  • 11
  • 89
  • 185