是否有可能通過模板實現類似於下面的僞代碼的東西?如果是這樣,在這裏獲得適當的編譯時多態性的正確方法是什麼?謝謝!從對象矢量虛擬函數調用的模板版本
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();
編輯
由於上述引起了一些混亂,我想我應該添加一個提出的解決方案開始我只是發現,被賦予了類似於我自己的問題的一個例子。這是從一個古老的澳大利亞Linux下C++板拉離2001年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 ...
}
好的,謝謝。有沒有辦法做類似的事情,也許沒有使用運行時向量(因爲它需要基類指針)?也許,將矢量嵌入模板中? – jim 2013-04-09 11:29:44
即使您可以在編譯時生成跟蹤'n'個具體類型的'n'向量,如果您的目的是以某種方式將這些向量聚合成一個「主」Base *跟蹤向量,然後多次遍歷該主基向量仍然會產生類似的成本。完全避免這些成本的唯一方法是獨立運行每個矢量。順便說一句,你有個人簡介嗎?這對你來說真的是一個瓶頸嗎? –
2013-04-09 11:39:33
我的最後一條評論沒有特別的意圖,除了想知道是否可以跳過一個v-table查找來調用一個只有整數的子類(通過模板鍵入某個類),而不一定是通過向量。至於你的旁邊,提出的問題是增加我對C++的知識,即模板元編程,它優先於任何暗示我參與的「過早優化」。 – jim 2013-04-09 12:05:33