2

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

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 年的旧澳大利亚 linux c++ 板中提取的 http://lists.linux.org.au/archives/tuxcpprogramming/2001-August/000135.html

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

2 回答 2

2

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

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

于 2013-04-09T11:17:04.913 回答
2

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

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

//...

bases[i]->DoSomething();
于 2013-04-09T11:18:37.887 回答