2012-09-27 36 views
4

<>我使用C++並計劃一個包含大約100個模板參數的類。當然,我擔心有n個模板參數,如果用戶需要每個組合,我們有2^n個不同的類,這是一種代碼爆炸。但是,用戶需要爲此做2^n個實例。C++中的模板參數太多?

我的問題是:有這麼多模板參數的主要技術問題?

注:

  • 隨着技術,我在有關可讀性主觀的答案不感興趣,設計等等。我的意思是像
    • 運行
    • 代碼大小
    • 最大的一些事實模板允許

代碼示例:

// here we have 2, but I have 100 template parameters 
template<typename T1, typename T2> 
class Class 
{ 
    T1 x; 
    T2 y; 
    int add(T1 _x, T2 _y) { return _x+_y; } // 4 instanciations possible? 
    Class<T2, T1>* swap() { return new Class<T2, T1>(); } // always 2 instanciations? 
}; 
+1

您不能放棄設計注意事項。這*是*糟糕的設計,部分*由於技術限制。 –

+2

你真的需要澄清你的意思是「100模板參數」。我想到的想象是一個有100個模板參數的模板。在得克薩斯州,我們有這種設計的時間:拿繩子。 –

+1

我不想保留這段代碼.... – Filipe

回答

3

主要考慮的因素是代碼大小,這可能會影響性能。每個不同的模板實例化都需要生成所有使用的成員函數(或者全部,如果用戶執行手動模板實例化)。在不同的模板實例中不會重複使用代碼。

除此之外,您提供大量參數的任何元素都很難處理。從維護角度來看,具有10個參數的聲明已經很難閱讀。它要麼延長多條線,要麼延長線的寬度,並且很難通過檢查確定所有參數都處於正確的位置。 X是第7還是第8個參數?是的,你可以數它們,但它變得痛苦。如果參數的數量是100,那麼問題就會加劇。

爲什麼你想要所有這些模板參數?沒有更多的信息,你不會得到其他的建議,但是對於同樣的問題,最有可能的其他設計也不需要那麼複雜。也許這些參數在編譯時不需要知道(它們可以以數組/矢量的形式傳遞給函數/構造函數,用於非類型參數),或者可以對它們進行分組(一個類型模板參數保存一組相關的typedef )...

+0

是的,分組也是我的想法。當你傳遞'std :: string'時,你隱藏了'char'參數 - 就像那樣。但是從你寫的內容來看,你認爲代碼爆炸可能會呈指數增長(即使是線性數量的實例和成員)? – Johannes

+0

@Johannes:這取決於你的代碼。如果將會有一個專業化,不會有代碼爆炸。如果程序中的每個對象都有一組略微不同的模板參數,那麼將爲每個對象生成使用的函數,並且會出現代碼爆炸。程序中唯一模板實例的數量並不直接取決於模板參數的數量,儘管存在更多的參數意味着有更多的選項可以實現。 –

+0

謝謝,我需要很多模板參數的環境,但它們自然會分組爲切片,因此摸索會做到這一點。再次感謝。 – zzz777

4

實際上模板類類型是在編譯時決定的。這並不意味着你有2^n個不同的類,而是你只有n個類。在編譯時,替換適當的類型,並且類成員/函數只是您使用它們的類型。

E.g.

template <class Type1, class Type2> 
class A 
{ 
private: 
    Type1 member_x; 
public: 
    Type2 GetTypeValue(Type1, Type2); 
}; 

當實例化是這樣的:

A<int, string> *x = new A<int, string>(); 

是否正在僅作爲一個整型構件和一個字符串類型成員的類編譯。同樣代表功能等

更新: 有了更新的例子下面你仍然具有的功能只有一個實例,這將是一個string返回函數參數取和intstring

+0

好的,但如果我們有'Type1 member_x'和'Type2 member_x',並且有一個同時使用這兩個成員函數的成員函數,我們可能不會得到4個成員函數嗎? – Johannes

+0

您能否提供一個澄清的代碼示例? –

+1

@Johannes我編輯了這篇文章,提供了有關您的問題的其他解釋。所有的事情都是在編譯時執行的。 –