2013-04-11 33 views
5

şablon şablon parametresi ve iki politika tanımları ile ayarlanan bir politikaya bir şablon sınıfı C düşünün: Şablon şablon parametresi

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

çünkü şablon argümanların yanlış numara çalışmıyor. Ek şablon parametreleri için türler belirtirseniz PolicyTwo şablonunu POLICY şablon parametresi olarak kullanmanın bir yolu var mı?

C++ 03 kullanıyorum, bu nedenle diğer ad bildirimleri kullanılamaz. this question'un farkındayım, ama benim sorunumda bir çözüm göremiyorum.

cevap

3

, sen takma şablonları yerine miras ile yönetmek mümkün olabilir:

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

Ben mevcut mekanizma ile bu çözmek için hwo göremiyorum, ama bunun çalışma şeklini tersine çevirebilir ve uygun derleme (ve hatta sınıf şablonu parametresini kaldırarak karmaşıklığını azaltabilir):

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 
} 

Temel fikir, tempalte parametresini ilke kullanıcısı dışına taşımak ve bunun yerine tam olarak örneklenmiş bir ilke vermektir. Ardından, ilke, şablon türünü politika kullanıcısına bir yazım hatası (gerekirse) aracılığıyla sağlar. politika nasıl kullanıldığına bağlı olarak

+0

bana bir ilan etmeye izin vermediğinden Bu çözüm benim için çalışmıyor "T" bağımsız olarak çalışan "POLICY" için varsayılan değer. –

+0

@Gabriel Schreiber Politikanız, şablon tipi parametresini (hala türünü göstermeye devam ederken) görmezden gelmeyi seçebilir ve ardından T'den bağımsız olarak çalışır. –

İlgili konular