如何在编译时访问模板化类的模板类型?
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();
}
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 使用简单类型列表实现的指数编译时间.为什么
- 编译标准库类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 标量类型的特征模板无法编译固定大小的子矩阵操作
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 由于类型从 C 转换为 C++,无法编译错误 C2440
- 通过编译时值推断整数的类型
- 基于派生类型的编译时行为分支
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 将函数类型作为模板参数传递不会编译
- 枚举类的基础类型别名为整型类型(编译错误)
- 无法将类型转换为类型*-C++编译错误
- 返回仅移动类型编译,即使复制构造函数不可用
- 如何根据模板中的类型编译函数
- 无法使用模板化类型编译 va_arg() 调用,因为模板参数中的逗号