如何在编译时访问模板化类的模板类型?

How to access a template type of a templated class at compile time?

本文关键字:类型 编译 访问      更新时间:2023-10-16

我正在尝试编写一个基本的TaskRunner系统。 工作线程对象执行一些工作并返回结果。任务运行程序运行工作线程对象并返回该工作线程的结果。 这是我现在所拥有的(通常的警告适用:简化示例;这可能无法编译):

工人类:

template<typename ResultType>
class Worker
{
public:
virtual ~Worker() = 0;
virtual ResultType DoWork() = 0;
};

流道类:

template<typename ResultType, typename WorkerType>
class TaskRunner
{
public:
template<typename... Args>
TaskRunner( Args&&... args )
{
Worker = std::unique_ptr<WorkerType>(new WorkerType(std::forward<Args>(args)...));
}
~TaskRunner() {}
ResultType StartWork() 
{
return Worker->DoWork();
}
private:
std::unique_ptr<WorkerType> Worker;
};

我想专门化每个工人以返回具体类型:

class CustomWorker : public Worker<int>
{
public:
CustomWorker(int InNumber) : Number(InNumber) {}
~CustomWorker() {}
int DoWork() override { return Number; };
private:
int Number;
};

我有所有这些工作,并且可以通过这个调用启动系统:

TaskRunner<int, CustomWorker> CustomTask(1);

这样做的问题是 CustomWorker 与返回类型 int 紧密耦合。 这是适用于此任务的唯一模板类型组合。 每个工作人员将有一个,并且只有一个返回类型。 因此,我希望能够致电:

TaskRunner<CustomWorker> CustomTask(1);

但这似乎需要了解 TaskRunner::StartWork 定义中 CustomWorker 的模板化类型。

像这样的东西...

template<typename WorkerType>
class TaskRunner
{
public:
...
WorkerType::ResultType StartWork() 
{
...
}
...

是否有一些模板语法/constexpr 魔法可以帮助我实现这一目标?

如果你想将StartWork声明为返回任何DoWork()返回的内容,那么你可以选择让实现在 C++14 中弄清楚

auto StartWork() 
{
return Worker->DoWork();
}

或者,在 C++11 中使用decltype指定它

auto StartWork() -> decltype(Worker->DoWork())
{
return Worker->DoWork();
}