通常,如果我有一个 Foo
或一个 Bar
,我会做类似的事情:
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.
Foo
和 Bar
不需要以任何可能的方式关联,并且可以具有完全不同的构造函数。此外,我可能希望在未来支持任意数量的类,而不必实际修改 MyAwesomeFunc
这可能吗?一种简单的方法是让 Foo
和 Bar
都继承自某种类型,例如 Baz
,并让重载方法返回一个 Baz
,您将其转换回 Foo
或 Bar
...
Baz* MyAwesomeFunc(){
return new Foo();
}
Baz* MyAwesomeFunc(int a,int b,int c){
return new Bar(a,b,c);
}
但这里的问题是你必须写:
- 支持的每个类的方法
- 以及每种构造函数签名。
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 来完成它和 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++ - 是否可以创建一个通用方法或类来创建任何类的 "new"实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42128850/