2014-04-16 62 views
0

我已經在類絆倒多次這樣定義模板類

class PureVirtualClass 
{ 
    virtual int foo() = 0; 
    virtual bool bar() = 0; 
} 

template <class T> class ImplClass : public virtual PureVirtualClass 
{ 
    virtual ~ImplClass(){}; 
    int foo() { return 42;} 
    bool bar() { return true;} 
    //several other method having nothing to do with T 
} 

這種「設計」出現這樣的時候我要想想當初開發商知道他被定義ImplClass因爲這樣做模板類,但沒有任何參考到模板參數T隨時隨地。我自己的C++模板知識有限。

這是否有益處,還是隻是一個困惑的程序員?

+1

也許他懶得把類分成.h和.cpp文件? – Philipp

+0

@Philipp他仍然可以提供標題中的所有定義,而不需要將類作爲模板。 –

+1

CRTP可能的基類? – user657267

回答

3

可以是被模板上課受益但不依賴於參數。大多數情況下,你看到這樣的東西來定義模板元編程(空)標籤結構:

template <class X> 
struct some_tag {}; 

像一般你的類的好處是,當你在每一個類具有相同的功能,它們是不同的類別,並且不能將其中一個複製到另一個類別中,即ImplClass<int>類型的對象與ImplCalss<float>類型的另一個對象不兼容。

+0

是的,但是有虛擬基礎和虛擬功能的成熟班是另一回事。 – Potatoswatter

3

有由Arne提到的想法很多有用的情況。舉例來說,看着Very basic tuple implementation,這是一個元組元素是如何定義的:

template <size_t N, typename T> 
class TupleElem 
{ 
    T elem; 
public: 
    T&  get()  { return elem; } 
    const T& get() const { return elem; } 
}; 

據模板上N,而不依賴於它。爲什麼?因爲元組執行

template <size_t... N, typename... T> 
class TupleImpl <sizes <N...>, T...> : TupleElem <N, T>... 
{ 
    //.. 
}; 

導出多個這樣的元件,每一個獨特的N,用作標識符。沒有它,TupleImpl將派生相同的類兩次,有兩個元素類型在參數包T...內相同。既不random access到元件將在這種情況下的工作(通過適當TupleElem基類的功能get()的顯式調用,這將是不明確的),也不empty base optimization(經由專門TupleElem空類型T有類型的數據成員T)。

這是一個真實的使用情況,以及究竟如何std::tuple由鐺實現。當然,像TupleElem這樣的類將是一個隱藏的實現細節,而不是接口的一部分。例如,gcc遵循完全不同的遞歸類設計。

通常,您需要研究環境,其中類用於瞭解設計者的意圖。

1

也許這只是開發商是懶得類分成的.h和.cpp文件?

不使用模板,如果類在多個編譯單元中使用會出現鏈接錯誤。使用模板時,鏈接器通常會在鏈接時丟棄模板的重複實例(或以不同方式處理問題)。雖然這可能是「開發人員爲什麼這樣做」的答案,但如果問題是「我應該何時引入從未使用過的模板參數」(請參閱​​其他答案),我不會推薦這個答案。即使將代碼拆分爲.h和.cpp(特別是用於Java或C#等語言時),它仍然是通常的C++方式。閱讀/理解比單純使用模板更容易。另外,它使類別的使用的可讀性降低。

+0

正如我在上面的註釋中所解釋的那樣,這只是一個解釋,如果這些類包含靜態數據成員,這在示例代碼中並不明顯。另一方面,由於這種懶惰是使用模板的一個非常愚蠢的原因,一個認爲它可能不知道內聯方法定義的開發人員就足夠了。 ;-) –