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

时间:2017-02-09 05:23:13

标签: c++ c++11 templates variadic-templates perfect-forwarding

通常,如果我有FooBar,我会做类似的事情:

Foo* foo = new Foo();

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

有没有办法使用模板或宏,我可以构建一个函数,这样我就可以这样做:

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

MyAwesomeFunc的实际方法签名对我来说并不重要。

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

这可能吗?一种简单的方法是让FooBar继承某种类型,例如Baz,并且重载方法返回Baz,然后将其强制转换为{{} 1}}或Foo ...

Bar

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

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

    目标是尽可能地编写单个类,方法或宏   调用一个函数(并传递任何参数),但调用右边   传入对象的构造函数。这可能吗?

    这个问题的目的是简单地探讨是否可以在C ++中做这样的事情。请不要提出共享指针,独特的指针,使用新的陷阱,因为这是偏离主题。

    编辑:我想只使用STL,并避免使用像Boost ....

    这样的东西

2 个答案:

答案 0 :(得分:8)

从C ++ 11开始,您可以使用variadic templateperfect 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); 

答案 1 :(得分:8)

是的,您可以使用模板和C ++ 11的“完美转发”:

#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和“智能指针”What is a smart pointer and when should I use one?