通常,如果我有Foo
或Bar
,我会做类似的事情:
Foo* foo = new Foo();
Bar* bar = new Bar(2,3,5);
有没有办法使用模板或宏,我可以构建一个函数,这样我就可以这样做:
Foo* foo = MyAwesomeFunc(Foo);
Bar* bar = MyAwesomeFunc(Bar,2,3,5);
MyAwesomeFunc
的实际方法签名对我来说并不重要。
Foo
和Bar
无需以任何可能的方式相关,并且可能具有完全不同的构造函数。此外,我可能希望将来支持任意数量的类,而无需实际修改MyAwesomeFunc
的代码
这可能吗?一种简单的方法是让Foo
和Bar
继承某种类型,例如Baz
,并且重载方法返回Baz
,然后将其强制转换为{{} 1}}或Foo
...
Bar
但这里的问题是你必须写:
目标是尽可能地编写单个类,方法或宏 调用一个函数(并传递任何参数),但调用右边 传入对象的构造函数。这可能吗?
这个问题的目的是简单地探讨是否可以在C ++中做这样的事情。请不要提出共享指针,独特的指针,使用新的陷阱,因为这是偏离主题。
编辑:我想只使用STL,并避免使用像Boost .... 这样的东西答案 0 :(得分:8)
从C ++ 11开始,您可以使用variadic template和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);
答案 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?