我有一个模板函数,它接受一个函数对象('functor')作为模板参数:
template <typename Func> int f (void) {
Func func;
return func ();
};
struct Functor {
virtual int operator () (void) = 0;
};
struct Functor0 : Functor {
int operator () (void) {
return 0;
}
};
struct Functor1 : Functor {
int operator () (void) {
return 1;
}
};
我想避免像if-else
一样阻止:
int a;
if (someCondition) {
a = f<Functor0> ();
}
else {
a = f<Functor1> ();
}
有没有办法使用类似于动态绑定的东西,例如:
a = f<Functor> (); // I know this line won't compile, it is just an example of what I need
并在运行时决定将(派生)类型作为模板参数传递?
答案 0 :(得分:7)
有没有办法使用类似于动态绑定的东西
没有。这基本上是不可能的。在代码中的某些时候,您需要区分大小写。当然,这不必手动编写;您可以使用宏(或再次模板)来生成必要的代码。但它需要在那里。
答案 1 :(得分:7)
避免检查的一种方法(如果那真的是你想要做的)是使用数组 - ..
Functor* fp[] = { new Functor0(), new Functor1() };
现在 - 使用someCondition
作为索引。
a = (*fp[someCondition])();
这完全依赖于运行时多态,而不是你正在使用的冗余模板机制......(顺便说一句。别忘了清理!)
当然,这是令人讨厌和坦率的多余,if
的开销将是微不足道的,但它增加了代码的清晰度是显着的......