![](/img/trans.png)
[英]How do I validate template parameters in compile time when a templated class contains no usable member functions?
[英]How to access a template type of a templated class at compile time?
我正在尝试编写基本的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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.