2012-03-22 18 views
0

可能重複:
Template Constraints C++C#的 「其中T:類」,在C++

我想知道如果我可以檢查是否T型在我的通用繼承某個類/模板化方法。我可以在C#中使用'where'輕鬆完成此操作。例如,在我的遊戲引擎中,我有一個通用管理器的概念,它是一個XNA組件。它有一個可繪製對象的列表(可能是實體,粒子等)。所以我的類定義是這樣的:

public class LayerableDrawableGenericManager<T> : Microsoft.Xna.Framework.DrawableGameComponent where T : Drawable 

所以我們只能有可借鑑的對象(即繼承繪製的對象)的通用管理。我們需要確定這一點,因爲在我的通用管理器中,我在所有這些T型對象上調用了Draw()。如果不確保T型對象繼承Drawable類(其中包含Draw()方法),我將無法繪製我的對象。

無論如何,想知道這是如何在C++中完成的。我搜索了諸如「Where C++」和「Where keyword C++」之類的東西,並且我所有的結果都是「我可以在哪裏學習C++」等東西。

+0

有一些技巧允許這樣做,但通常它只是在沒有它的情況下工作,因爲如果調用draw方法且T沒有調用方法,則會發生編譯錯誤。主要的缺點是錯誤信息不夠清晰。 – 2012-03-22 00:19:45

+0

您搜索了'where'我搜索了'C++模板類型參數約束'看到我將它顯示爲重複的問題。 – 2012-03-22 00:19:47

+0

C++在這方面實際上是*結構類型*而不是* nominatively-typed *只是替換T,並且如果它編譯的話,萬歲! – 2012-03-22 00:22:01

回答

0

當然。最顯而易見的方法是dynamic_cast

template<class T> 
bool is_Iinterface(T obj) { 
    Iinterface ptr = dynamic_cast<Iinterface>(obj); 
    if (ptr == nullptr) 
     return false; 
    else 
     return true; 
} 

或簡明:

template<class T> 
bool is_Iinterface(T obj) { 
    return dynamic_cast<Iinterface>(obj)!=nullptr; 
} 

然而,更常見的和有用的方法是使用操作符重載。

template<class T> 
void do_task(T obj) { 
    //do task on object that doesn't have Iinterface 
} 
void do_task(Iinterface& obj) { 
    //do task on object that does have Iinterface 
} 
2

這通常是在C++模板中完成的,只是假設類型提供了您需要的功能。例如,考慮下面的函數模板:

template <typename T> 
int get_value(T const& x) 
{ 
    return x.get(); 
} 

struct S { int get() const { return 42; } }; 

如果調用get_value(S()),編譯器將實例get_valueT = S,並且S::get將被調用。

如果調用get_value(42),編譯器會嘗試實例get_valueT = int,但實例會失敗,你會得到一個編譯錯誤,因爲int沒有任何成員函數(更多或命名get少一個)。