2013-04-09 76 views
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(); 

編輯

由於上述引起了一些混亂,我想我應該添加一個提出的解決方案開始我只是發現,被賦予了類似於我自己的問題的一個例子。這是從一個古老的澳大利亞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 ... 
} 

回答

2

如果你的容器(矢量)追蹤基類實例的指針的集合,你需要支付每次的標準虛表指針/間接(或自定義等價物,這可能不值得)。

只有在編譯時知道具體(派生)類型時,纔會出現靜態消除vtable /函數指針開銷的可能性。

+0

好的,謝謝。有沒有辦法做類似的事情,也許沒有使用運行時向量(因爲它需要基類指針)?也許,將矢量嵌入模板中? – jim 2013-04-09 11:29:44

+0

即使您可以在編譯時生成跟蹤'n'個具體類型的'n'向量,如果您的目的是以某種方式將這些向量聚合成一個「主」Base *跟蹤向量,然後多次遍歷該主基向量仍然會產生類似的成本。完全避免這些成本的唯一方法是獨立運行每個矢量。順便說一句,你有個人簡介嗎?這對你來說真的是一個瓶頸嗎? – 2013-04-09 11:39:33

+0

我的最後一條評論沒有特別的意圖,除了想知道是否可以跳過一個v-table查找來調用一個只有整數的子類(通過模板鍵入某個類),而不一定是通過向量。至於你的旁邊,提出的問題是增加我對C++的知識,即模板元編程,它優先於任何暗示我參與的「過早優化」。 – jim 2013-04-09 12:05:33

2

我懷疑這是可能的,下面的代碼如何?

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

//... 

bases[i]->DoSomething(); 
+0

謝謝,我正在尋找將所有將上述內容轉換爲該多態性的模板版本。我認爲我的不正確的僞代碼把你拋棄了。對於那個很抱歉。 – jim 2013-04-09 11:26:40

+0

將更新該代碼的問題以避免更多混淆。 – jim 2013-04-09 13:08:43