gpt4 book ai didi

C++11,静态方法中派生类的类型推导

转载 作者:太空宇宙 更新时间:2023-11-04 15:19:00 25 4
gpt4 key购买 nike

最小的例子:

class Task
{
public:
template<typename T, typename... Args>
static T* make(Args... args) {
return new T(args...);
}
}

template<typename A, typename B, typename C>
class MyTask : public Task
{
public:
MyTask(A a, B b, C c)
{
}
}

make 工厂方法的存在使我不必在实例化模板化派生类时提供所有模板类型。

我希望能够尽可能简洁地创建 MyTask 实例,即:

auto my_task = MyTask::make(a, b, c);

但是,编译器坚持认为它不能推导 T,而是想要:

auto my_task = MyTask::make<MyTask<A, B, C>>(a, b, c);

这不是一个大问题,但重复似乎没有必要。有什么方法可以按照我想要的方式获得它吗?

最佳答案

问题是 MyTask::make 实际上不是那样,而是 Task::make。您在调用中使用的名称是查找的起点,而不是函数名称。所以从技术上讲没有重复。

您可以做不同的事情,例如,使用 CRTP(如 Massa 在评论中建议的那样)让派生类型将其类型注入(inject)基类——代价是为不同的基类使用不同的类型,如果你有一些实际的接口(interface),你将需要提供 CRTP 作为 TaskMyTask 之间的中间助手类型,或者更好地作为外部 CRTP 助手

template <typename T>
struct Maker {
template <typename ...Args>
static T *make(Args ... args) { return new T(args...); }
};

class MyTask : public Maker<MyTask>, public Task { ... };

auto task = MyTask::make(a,b,c);

另一种选择是使该函数成为一个自由函数并仅传递您要构建的类型:

template <typename T, typename ...Args>
T* make(Args ... args);

auto x = make<MyTask>(a,b,c); // only named once here

要在模板的上述代码中支持nice 语法而无需提供模板参数,您可以根据模板<实现make/em> 而不是类型:

template <template <typename...> class T,
typename ... Args>
T<Args...>* make(Args... args) {
return new T<Args...>(args...);
}

关于C++11,静态方法中派生类的类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23836394/

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