2015-11-05 37 views
3

我有一些代碼大量使用模板類。這是可能的,但不希望在這一點上改變現有的代碼庫。我需要編寫一個新的類,這個類將作用於兩個模板類(就這個問題而言)是任意的,除了有一個通用模板參數。一個簡單的例子:鏈接的模板模板參數 - 約束內部參數是相同的

template<typename T> 
class A { 
    // Implementation details 
}; 

template<typename T> 
class B { 
    // Implementation details 
}; 

template<typename T, typename X<T>, typename Y<T>> // This syntax is invalid! 
class C { 
    // Implementation details 
}; 

我需要寫類C。示例中顯示的語法提示我想要做什麼,但不起作用。這裏的模板參數XY必須通過採用相同的模板參數T「綁在一起」。除此之外,它們可以是任意的。

這意味着什麼「喜歡」 C<std::string,A<std::string>,B<std::string>>應該是有效的,但C<std::string,A<std::string>,B<std::map>>不應該因爲AB不具有相同的模板參數。 (「喜歡」的報價再次表示語法仍然是錯的上述C聲明)

其他嘗試(這也失敗了)包括:

  • template<typename T, template<typename> class X<T>, template<typename> class Y<T>>
  • template<typename T> template<typename X<T>, typename Y<T>>

是這樣的可能嗎?如果是這樣,語法是什麼?

謝謝!

+1

只需使用'模板類X,模板類Y>'然後'X '和'ÿ'無論你在你的'C'需要。 – Rostislav

回答

5

你可以局部專門C

//Primary template 
template<typename T, typename X, typename Y> 
class C; 

//Specialization for when the template parameters are the same 
template<typename T, template <typename> class X, template <typename> class Y> 
class C <T, X<T>, Y<T>> { 
    // Implementation details 
}; 

如果再使用無效的模板參數,你會得到一個編譯時錯誤。

Live Demo

+0

這個答案做了我想要的。隨着一些更多的修補,我能夠進一步改進它,使得參數「T」不需要由用戶明確提供。主模板是'模板<類型名稱X,類型名稱Y>類別C',專業化是'模板<模板類別X,模板類別Y,類型名稱T>類別C ,Y >'。 – Brick

+0

@Brick與答案有何不同? – einpoklum

+1

@einpoklum主模板有一個較少的參數,然後逐漸下降到稍微簡單的代碼。 – Brick

1

擴大到由TartanLlama接受的答案的評論,我是能夠改善這種略帶使得存在涉及少了一個模板參數。這導致了更簡單的代碼。

主要模板變成

template<typename X, typename Y> class C 

和專業化是

template<template<typename> class X, template<typename> class Y, typename T> class C<X<T>, Y<T>> 

這裏的區別在於主模板不具有相對於附加模板參數T什麼最初是由TartanLlama建議。

+0

是的,這絕對是一個改進:) – TartanLlama