2013-04-11 225 views
5

考慮模板C類通過模板的模板參數和兩個策略定義的策略集:與錯號碼的模板參數模板的模板參數

template<class T> struct PolicyOne { }; 
template<class T, int U, int V> struct PolicyTwo { }; 
template<class T, template<class> class POLICY> struct C { POLICY<T> policy; }; 

void f() 
{ 
    C<int, PolicyOne> mc1; 
    C<int, PolicyTwo<1, 2> > mc2; // doesn't work this way 
} 

PolicyTwo不因錯號的模板參數工作。 如果您指定其他模板參數的類型,是否有方法使用PolicyTwo作爲POLICY模板參數?

我正在使用C++ 03,所以別名聲明不可用。 我知道this question,但我沒有看到我的問題在那裏的解決方案。

回答

3

取決於政策如何使用,您可以代替別名模板與繼承管理:

template<int U, int V> struct PolicyTwoAdaptor { 
    template<class T> struct type: PolicyTwo<T, U, V> { }; }; 
C<int, PolicyTwoAdaptor<1, 2>::type> mc2; 
0

我看不到藿與您當前的機制來解決這個問題,但你可以扭轉它的工作方式,它應該編譯罰款(甚至可通過去除類模板參數減少複雜性):

template <typename T> struct PolicyBase { typedef T value_type; }; 
template<class T> struct PolicyOne : public PolicyBase<T> { }; 
template<class T, int U, int V> struct PolicyTwo : public PolicyBase<T> { }; 
template<class POLICY> struct C { POLICY policy; typedef typename POLICY::value_type T; }; 

void f() 
{ 
    C<PolicyOne<int> > mc1; 
    C<PolicyTwo<int, 1, 2> > mc2; // doesn't work this way 
} 

其基本思路是將類型tempalte參數移出策略用戶,並給它一個完全實例化的策略。然後,策略通過typedef(如果需要)將其模板類型提供給策略用戶。

+0

此解決方案不適合我,因爲它不會讓我申報'POLICY'的默認值獨立於'T'工作。 – 2013-04-11 15:37:19

+0

@Gabriel Schreiber你的策略可以簡單地選擇忽略它的模板類型參數(同時仍然暴露它的類型),然後它獨立於'T'工作。 – 2013-04-11 16:02:43