是否可以创建一个通用方法或 class 来创建任何 class 的 "new" 实例?

Is it possible to create a generic method or class that one can use to create "new" instances of any class?

通常情况下,如果我有 FooBar,我会这样做:

Foo* foo = new Foo();

Bar* bar = new Bar(2,3,5);

有没有一种方法可以使用模板或宏来构造一个函数,这样我就可以做类似的事情:

Foo* foo = MyAwesomeFunc(Foo);
Bar* bar = MyAwesomeFunc(Bar,2,3,5); 

The actual method signature of MyAwesomeFunc is not important to me.

FooBar 不需要以任何可能的方式相关,并且可以具有完全不同的构造函数。此外,我可能希望在将来支持任意数量的 classes 而不必实际修改 MyAwesomeFunc

的代码

这可能吗?一种简单的方法是让 FooBar 都继承自某种类型,例如 Baz,并重载方法 return 和 Baz,您将其转换为回到 FooBar...

Baz* MyAwesomeFunc(){
    return new Foo();
}

Baz* MyAwesomeFunc(int a,int b,int c){
    return new Bar(a,b,c);
}

但是这里的问题是你必须写:

  1. 每个 class 支持的方法
  2. 以及每种构造函数签名。

The goal, is to write a single class, method, or macro, where we can call one function (and pass it any arguments), but call the right constructor of the passed in object. Is this possible ?

这个问题的目的是简单地探索是否可以在 C++ 中做这样的事情。请不要提出共享指针、唯一指针、使用 new 的陷阱,因为那是题外话。

编辑:我只想使用 STL,避免使用像 Boost 这样的东西....

从 C++11 开始,您可以使用 variadic template and perfect forward 来完成。例如。写一个模板函数,完美的将参数传递给模板参数指定类型的对象的构造函数

template <typename T, typename... Ts>
T* MyAwesomeFunc(Ts&&... params){
    return new T(std::forward<Ts>(params)...);
}

然后用作

Foo* foo = MyAwesomeFunc<Foo>();
Bar* bar = MyAwesomeFunc<Bar>(2,3,5); 

是的,您可以使用模板和 C++11 的 "Perfect Forwarding":

#include <type_traits>
#include <utility>

template<typename T, typename... Args>
T* createNew(Args&&... args)
{
  static_assert(std::is_constructible<T, Args...>::value, "T is not constructible with these arguments");
  return new T(std::forward<Args>(args)...);
}

或者,您可以查看 C++11 的 std::make_unique 和 "Smart Pointers" What is a smart pointer and when should I use one?