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

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

通常,如果我有一个 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.

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

的代码

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

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

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

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

  1. 支持的每个类的方法
  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 来完成它和 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/

相关文章:

c++ - 将类转换为结构

c++ - 我如何定义一个即使参数为非常量也不能更改其参数的函数?

C++11 std::thread 给出错误:没有匹配的函数来调用 std::thread::thread

templates - Golang 模板 : for construction

c++ - 将任意数量的类型插入到一组模板参数中

C++ Cast 两种不同内存布局的类型

c++ - OpenCV imshow 不在 osx 中显示图像

c++ - Signals2 connect() 使用模板

c++ - 为什么decltype((i))是引用类型,而decltype(i+0)是int类型?

没有模板参数的类的 C++ 专用构造函数(跳过尖括号)