虚拟函数的模板版本从对象向量调用

时间:2013-04-09 11:12:30

标签: c++ templates vector polymorphism

是否可以通过模板实现类似于下面的伪代码?如果是这样,在这里获得正确的编译时多态性的正确方法是什么?谢谢!

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 ...
}

2 个答案:

答案 0 :(得分:2)

如果你的容器(vector)跟踪一个基类实例指针的集合,你需要为每个实例支付标准的vtable指针/间接(或者可能不值得努力的自定义等价物)。

当您在编译时知道具体(派生)类型时,静态消除vtable /函数指针开销的可能性就会出现。

答案 1 :(得分:2)

我怀疑这是可能的,下面的代码怎么样?

std::vector<Base*> bases;
bases.push_back(new Derived());
bases.push_back(new Derived1());

//...

bases[i]->DoSomething();