【发布时间】:2017-03-17 09:13:40
【问题描述】:
我有一个模板类如下:
template<typename A> struct TaskInfo{
typedef A _A;
static void bar(A a){blah blah...} };
template <typename TaskInfo> class Task {
typedef typename TaskInfo::_A A;
bar(A a){
blah blah...
TaskInfo::bar(a);
}
}
我有一个包含这些类的对象:
using TaskInfoX= TaskInfo<int>; //ignore the bar implementation for the time being.
using TaskInfoY= TaskInfo<double>;
class TaskCollection(){
TaskCollection(){
auto Task1=new Task<TaskInfoX>;
auto Task2=new Task<TaskInfoY>;
Register(Task1);
Register(Task2);
}
Register(...);
}
我想知道是否可以定义一个枚举列表:
enum TaskEnum
{
Etask1,
Etask2
};
还有一个函数getTask,这样我就可以在我的应用中拥有:
int main {
TaskCollection collection;
int testInt;
double testDouble;
collection.getTask(Etask1)->bar(testInt);
//collection.getTask(Etask1)->bar(testDouble); //want compile error.
collection.getTask(Etask2)->bar(testDouble);
}
我知道我可以拥有 CRTP 或虚拟继承等价物,它允许我为 bar() 传递可变参数,但我想在编译时对 bar 函数的参数进行类型检查。这在 C++ 中是不可能的吗?
更新:为错字道歉。本来应该是:getTask(task1)。基本上外界不知道任务的底层结构,只知道它们的公共枚举密钥。另请注意,通常会有其他任务可能重用 typeInfoX 参数。
【问题讨论】:
-
CRTP 都是编译时间所以你为什么要费心使用它?
-
collection.getTask<Task1>()->bar(testInt);之类的东西可能是可能的。 -
为错字道歉。本来是这样的:getTask(task1) 基本上外界不知道任务的底层结构,只知道它们的公共枚举密钥。
-
@πάνταῥεῖ 不确定我是否理解您的问题,但正如我所说,我想要对 bar 参数进行静态类型检查
-
@shu 基于 CRTP 的模式和调度的重点是在编译时完成的静态类型检查(也称为静态多态性)。
标签: c++ templates types type-conversion