是否可以创建一个通用方法或 class 来创建任何 class 的 "new" 实例?
Is it possible to create a generic method or class that one can use to create "new" instances of any class?
通常情况下,如果我有 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
不需要以任何可能的方式相关,并且可以具有完全不同的构造函数。此外,我可能希望在将来支持任意数量的 classes 而不必实际修改 MyAwesomeFunc
的代码
这可能吗?一种简单的方法是让 Foo
和 Bar
都继承自某种类型,例如 Baz
,并重载方法 return 和 Baz
,您将其转换为回到 Foo
或 Bar
...
Baz* MyAwesomeFunc(){
return new Foo();
}
Baz* MyAwesomeFunc(int a,int b,int c){
return new Bar(a,b,c);
}
但是这里的问题是你必须写:
- 每个 class 支持的方法
- 以及每种构造函数签名。
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?
通常情况下,如果我有 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
不需要以任何可能的方式相关,并且可以具有完全不同的构造函数。此外,我可能希望在将来支持任意数量的 classes 而不必实际修改 MyAwesomeFunc
这可能吗?一种简单的方法是让 Foo
和 Bar
都继承自某种类型,例如 Baz
,并重载方法 return 和 Baz
,您将其转换为回到 Foo
或 Bar
...
Baz* MyAwesomeFunc(){
return new Foo();
}
Baz* MyAwesomeFunc(int a,int b,int c){
return new Bar(a,b,c);
}
但是这里的问题是你必须写:
- 每个 class 支持的方法
- 以及每种构造函数签名。
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?