2013-02-27 24 views
-2

在C#我可以定義這樣的:通用類變量

public interface BaseObject 
{ 
    int GetValue(); 
} 

public class Test<T> where T : BaseClass 
{ 
    T BaseObject; 
} 

這意味着我知道我可以alwaysa調用BaseObject.GetValue()/ BaseObject->的GetValue();因爲我知道baseobject有這個方法。

在C++中有類似的方法嗎?這樣我就可以定義多個類可以繼承的接口以及可以利用此類的類。

回答

-1

模板,它比C#泛型更強大(不是說它們必然更好,只是不同)。

template<class T> 
class foo 
{ 
public: 
    int whatever() 
    { 
     return obj.GetValue(); 
    } 
private: 
    T obj; 
}; 

將爲您使用的每個模板參數創建一個單獨的類。如果您提供的模板類型會導致錯誤,您將在編譯時知道。

+0

但我需要限制T是某種類型。所以它必須是一個從另一個對象繼承的對象。 – Deukalion 2013-02-27 21:49:26

+1

@Deukalion:那麼你可以使用C#。 C++是具有不同語義的不同語言。我認爲你不需要*去做你所說的話,這只是你的感覺,因爲你對C#中的事情做了更多的經驗,而對C++沒有經驗。您仍然可以在編譯時檢查您的模板參數是否支持所需的接口,但不在類型級別。 – 2013-02-27 21:50:14

+0

我問是否有類似的方法來產生相同的結果,而不是必須重現多個類。例如,如果我希望T成爲一個基類,其中包含該對象的類將使用的方法,但另一個對象可以擴展該對象,這意味着該對象只需知道它是從BaseClass繼承的對象。 – Deukalion 2013-02-27 21:53:51

0

你在問關於的C++概念,這是一種指定模板參數要求的方法。他們是在C++ 11工作期間提出的,但事實證明它們並不及時完成。但他們只是被推遲了,沒有被遺忘。

與此同時,鴨子打字仍然非常強大,並且當你傳遞一個沒有所需接口的模板參數時,它會被捕獲。它只是不會很好地報告問題。

作爲一種變通方法,一個簡單的方法來檢查你顯示約束向上轉型,只有當需要的事實指針轉換是隱含的優勢:

public class Test<T> where T : BaseClass 
{ 
    static T* enforcement_helper = 0; 
    static BaseClass* enforce_inheritance_constraint = enforcement_helper; 

}; 

根據你的編譯器是如何利用新的,你可能需要把這些行放在一個特殊的成員函數中(析構函數是好的,因爲它幾乎總是被處理)。

但是,您應該只檢查約束以改善錯誤消息(通過在代碼的明確註釋部分中導致失敗)。 C++模板是鴨子類型的,他們將與提供所需操作的任何模板參數一起工作。沒有正式的「界面」是必需的。