2014-09-22 60 views
0

假設我有以下類工作:如何使用受限模板?

template<class I, class O> 
class TE {...}; //This is an abstract class 

template<class I, class O> 
class TESO: public TE {...}; 

template<class I, class O> 
class TEMO: public TE {...}; 

現在我想創建一個新類TQ應該這樣初始化:

TQ<int,bool, TESO<int,bool>> tq1; 
TQ<int,bool, TEMO<int,bool>> tq2; 

而且我不知道是什麼編寫TQ類的正確方法。

我想這個問題:

template<class I, class O, TE<I,O>> 
class TQ { 
private: 
    std::vector< TE<I,O> > TEs; 
public: 
... 
}; 

但我不能完全確定,因爲我有一個編譯錯誤:

template<class I, class O, TE<I,O>> 
inline std::ostream& operator<<(std::ostream& os, const TE<I,O>& tq) { 
    os << ":" << std::endl; 
    return os; 
} 
+0

':保護TE ' - 你的意思是':受保護的TE '? (另外,受保護的繼承是一個相當奇怪的選擇。) – 2014-09-22 10:58:14

+0

將在一分鐘內得到修復和更新。 – 2014-09-22 11:00:57

+0

什麼是你想要的限制?爲什麼? – Yakk 2014-09-22 11:42:52

回答

1
template<typename I, typename O, template<typename, typename> class TE> 
class TQ { 
    std::vector< TE<I,O> > TEs; 
}; 


TQ<int, bool, TESO> tq1; 
TQ<int, bool, TEMO> tq2; 

Demo

而且我寧願選擇另一個名稱作爲模板參數TE以避免與源頭混淆nal class TE,儘管現在它可以從TQ類中作爲::TE<...>訪問。

2

您可能需要製作類別TQTE<I,O>模板參數a "template template parameter"

如下:

template<class I, class O, template <typename, typename> class TE> 

這使模板類TE在你的模板類TQ作爲模板中使用;即它允許您按照TE<I,O>std::vector< TE<I,O> > TEs;而不只是std::vector<TE> TEs;(見下文)編寫代碼。

或者,如果在TE中使用的類型並非特別要求與TQ中使用的類型相同,則可以使用簡單的第三參數;

template<class I, class O, class TE> 
1

的另一種方法是:

template <typename T> class TQ; 

// specialization 
template <typename I, typename O, template <typename, typename> class C> 
class TQ<C<I, O>> 
{ 
    // Your implementation. 
}; 

,然後使用它:

TQ<TESO<int,bool>> tq1; 
TQ<TEMO<int,bool>> tq2; 

編輯

當你需要有TQ<int, bool, TESO<int, bool>>,你可以使用,而不是:

template <typename I, typename O, typename T> class TQ 
{ 
    // cannot be static_assert(false, ""), 
    // The condition need to be dependent of template type 
    // to have the error when we want 
    static_assert(sizeof(I) == 0, "Bad type"); 
}; 

// specialization 
template <typename I, typename O, template <typename, typename> class C> 
class TQ<I, O, C<I, O>> 
{ 
    // Your implementation. 
}; 

然後按照指定使用它:

TQ<int, bool, TESO<int, bool>> tq1; 
TQ<int, bool, TEMO<int, bool>> tq2; 

Live example

不匹配(如TQ<int, int, TESO<int, bool>>)任何類型會招來一個編譯時錯誤

+0

我必須支持: TQ > tq1; TQ > tq2; – 2014-09-22 17:01:55

+0

@Doppelganger:回答編輯以符合您的要求。 – Jarod42 2014-09-22 18:15:11

+0

我仍然收到編譯錯誤: https://www.dropbox.com/s/xfthrwfaon78hfs/Screenshot%202014-09-22%2021.22.46.png?dl=0 – 2014-09-22 18:22:11