2013-08-05 59 views
2

是否有某種方式將模板部分綁定到參數類型?例如,我有以下的模板:部分模板綁定,創建新模板類型

template<typename T, typename Q> struct generic { }; 

而且我還有一個模板,需要一個模板類作爲參數,期待能夠創建它的實例與第一類:

template<typename T, template<typename> class Impl> 
struct wrapper { 
    Impl<T> foo; 
}; 

這將接受一個簡單的模板,如template<typename T>而不做更改。我現在想要做的是部分綁定generic模板,僅指定Q並將其傳遞到wrapper。製作了一些語法,也許是這樣的:

template<typename T> bound = generic<T,some_type>; 

我知道我幾乎能得到我想要使用的是什麼繼承:

template<typename T> bound : public generic<T,some_type> { }; 

我希望雖然雖則避免這種情況,因爲它出現問題的原因構造和在基類中定義的運算符。

+1

'template using bound = generic ;'?又名「template-typedef」? –

+0

@BartekBanachewicz,看起來不錯...我不能測試它,因爲我在GCC 4.6上,它不支持它。這可能意味着沒有早期的功能。 –

+0

這個特性也被認爲是* Template Aliases *,根據[這個圖表](http://gcc.gnu.org/projects/cxx0x.html),它確實支持自從'4.7'。 –

回答

4

在C++ 11可以使用模板別名

template<class X> 
using Bind_CPP11 = generic<X, Y>; 

template<class X, template<class> class Impl> 
struct wrapper_CPP11 
{ 
    Impl<X> foo; 
}; 

在C++ 98/03,您可以使用簡單的class composition(我不會使用繼承這裏)

template<class X> 
struct Bind_CPP03 
{ 
    typedef generic<X, Y> type; 
}; 

template<class X, template<class> class Impl> 
struct wrapper_CPP03 
{ 
    typename Impl<X>::type foo; 
// ^^^^^^^^ to extract dependent type 
}; 

Live Example

+0

構圖要求'包裝器'會改變它如何引用類型。我不確定我是否可以這樣做,但答案仍然很好。 –

+0

@ edA-qamort-ora-y是的,所以如果你升級到C++ 11,修復'wrapper'將是一個TODO – TemplateRex