Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function that takes both variadic arguments and a class type?

In C++, is it possible to create a templated function which takes both a class type and a variable number of arguments? The function I'm imagining would work something like this (although this is clearly not the right syntax, since it doesn't work when I try it):

// definition
template <class T, class... Args>
T* myFunc(Args... args) {
  T* newObj = new T(args);
  return newObj;
}

// usage
class MyClass {
  int myA;
  float myB;
  bool myC;
public:
  MyClass(int a, float b, bool c) {
    myA = a;
    myB = b;
    myC = c;
  }
}

class OtherClass {
  char otherA;
  int otherB;
public:
  OtherClass(char a, int b) {
    otherA = a;
    otherB = b;
  }
}

MyClass* myPtr = myFunc<MyClass>(5, 3.0, true);
OtherClass* otherPtr = myFunc<OtherClass>('h', 572);

I know you can create template functions that work with a type specified in angle brackets when the function is called, and I also know that it's possible to make variadic template functions which take multiple input values of any type, but I haven't been able to find any information on combining those two techniques.

Is such a thing possible?

like image 453
Enderhippo Avatar asked Oct 16 '25 00:10

Enderhippo


1 Answers

You just need to expand the pack args using ellipsis ... as shown below:

template <class T, class... Args>
T* myFunc(Args... args) {
  T* newObj = new T(args...);
  return newObj;
}

Working demo


Don't forget to use delete or better yet use smart pointer like auto newObj = std::make_unique<T>(args...);

like image 54
Anoop Rana Avatar answered Oct 17 '25 16:10

Anoop Rana