2012-10-31 122 views
1

我見過的建議使用從當許多派生類型是可能的基本類型的實例獲取的派生類型

if(dynamic_cast<DerviedType1*>(base)){ 
    // Do something 
} 
else if(dynamic_cast<DerviedType2*>(base)){ 
    // Do something else 
} 
else if(dynamic_cast<DerviedType3*>(base)){ 
    // Do another thing 
} 
// and so on 

雖然功能對這個問題的解決方案,該解決方案還遠遠優雅,而且我希望有一個單行解決方案,沿着decltypetypeid的路線,這兩者都不能幫助我。

我的具體問題如下。我有一個函數將一個指向基類實例的指針作爲參數。然後這個函數會調用一個模板函數,它將派生類型作爲參數。例如。

我想保持我的代碼簡單,沒有if報表一籮筐,但我不知道如何去做。應該注意的是,Base對象本身不會被傳遞到模板函數中,只是它的類型。

僅供參考,我在尋找沿

void myFunc(Base *base) 
{ 
    myTemplateFunc<decltype(base)>(); 
} 

線的東西,但是這隻會返回Base類型,它並不能幫助我在這裏。

+0

實際上'decltype(基)'將是一個'基地*',不是'基地'。另外,在編譯時必須知道模板的模板參數,所以你必須讓'myFunc'成爲一個模板,它可以用真實類型的'Base'調用,這可能或不可能,所以模板本身不會工作。 –

回答

6

另一種方式是多個調度

class Base 
{ 
    virtual void dispatch() = 0; 
}; 

template <class T> 
class BaseTpl : public Base 
{ 
public: 
    void dispatch() {myTemplateFunc<T>();} 
}; 

然後

class DerviedType1 : public BaseTpl <DerviedType1> 
{ 
}; 

和實際ussage

void myFunc(Base *base) 
{ 
    base->dispatch(); 
} 
+0

非常感謝您的回答。這很棒 :) –

5

如何

struct Base 
{ 
    virtual void execute() = 0; 
} 

struct Derived : Base 
{ 
    virtual void execute() 
    { 
     myTemplateFunc<Derived>(); 
    } 
} 

,只是把它作爲

void myFunc(Base *base) 
{ 
    base->execute(); 
} 

將分派到正確的方法。

+0

我在CRTP中添加了一個例子,我希望我沒有搞砸你的答案。 –

+0

@SethCarnegie,因爲我沒有想到這個,我回滾了。也許你可以添加一個答案(如果你是我+1) –

+0

非常感謝你的回答。我希望我可以接受不止一個,因爲他們都很棒。請接受+1而不是:) –