2011-11-01 71 views
0

爲了簡潔的目的,這是簡化的層次:使用std :: is_base_of與類層次decltype

class IBase 
{ 
public: 
    virtual ~IBase() = 0 { }; 
}; // eo IBase 


class IDerived : public virtual IBase 
{ 
public: 
    virtual ~IDerived() = 0 { }; 
}; // eo IDerived 

class Base : public virtual IBase 
{ 
public: 
    Base() { }; 
    virtual ~Base() { }; 
}; // eo Base 


class Derived : public IDerived 
       , public Base 
{ 
}; // eo Derived 

和一個函數來確定一個特定的指針指向一個類實現了通過「接口」 :

template<typename T> 
bool same(IBase* base) 
{ 
    if(std::is_base_of<T, decltype(*base)>::value) 
     return true; 
    return false; 
}; 

和樣本:

IDerived* i(new Derived()); 
bool isSame = same<IDerived>(i); 

我知道我可能我錯用decltype這裏。它似乎無論我嘗試,std::is_base_of<B,D>::value總是false。我想要這個函數做的是,回答這個問題:

對象是否指向從類型(T)派生的模板參數?

回答

6

decltype,像sizeof,是一個編譯時構造。這意味着,decltype(*base)將給出靜態類型的表達式*base,它是IBase。所以你打算實現的目標不能這樣做。

我建議這個解決方案:

template<typename T> 
bool same(IBase* base) 
{ 
    return dynamic_cast<T*>(base) != nullptr; 
}; 
+0

謝謝你。我希望避免使用dynamic_cast。但看起來這是現在的方式。 –

1
template<typename T> 
bool same(IBase* base) 
{ 
    if(std::is_base_of<T, decltype(*base)>::value) 

這可不行。 decltype(*base)將是IBase(始終),所以它永遠不會反映base的運行時類型。

也許你能做的最好的是dynamic_cast<T*>(base)!=0