我正在尝试编写一个基本的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魔法可以帮助我实现这个目标?
答案 0 :(得分:1)
如果你想声明StartWork
返回任何DoWork()
返回,那么你可以选择让实现在C ++ 14中找到它
auto StartWork()
{
return Worker->DoWork();
}
或者,在C ++ 11中用decltype
指定
auto StartWork() -> decltype(Worker->DoWork())
{
return Worker->DoWork();
}