gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:03 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com