是否可以通过模板实现类似于下面的伪代码?如果是这样,在这里获得正确的编译时多态性的正确方法是什么?谢谢!
class Base {virtual void DoSomething();};
class Derived:public Base{void DoSomething();};
class Derived1:public Base{void DoSomething();};
class Derived2... etc.
std::vector<Base*> bases;
bases.push_back(new Derived());
bases.push_back(new Derived1());
etc...
bases[i]->DoSomething();
修改的
因为上面引起了一些混乱,我想我应该添加一个建议的起始解决方案的例子,我刚刚发现这是一个类似于我自己的问题。这是从2001年http://lists.linux.org.au/archives/tuxcpprogramming/2001-August/000135.html的旧澳大利亚Linux c ++板开始的:
squareTy square;
twiceTy twice;
thriceTy thrice;
functionBaseTy* fns[] = { &square, &twice, &thrice };
template <class T, int N>
inline
void my_algorithm(T* functions[N])
{
// This deduces T and the array size N
my_real_algorithm(functions, N);
}
template <class T> // not inline
void my_real_algorithm(T* functions, int n)
{
// Loop here ...
}
答案 0 :(得分:2)
如果你的容器(vector)跟踪一个基类实例指针的集合,你需要为每个实例支付标准的vtable指针/间接(或者可能不值得努力的自定义等价物)。
当您在编译时知道具体(派生)类型时,静态消除vtable /函数指针开销的可能性就会出现。
答案 1 :(得分:2)
我怀疑这是可能的,下面的代码怎么样?
std::vector<Base*> bases;
bases.push_back(new Derived());
bases.push_back(new Derived1());
//...
bases[i]->DoSomething();