2012-12-27 170 views
1

假設我們有一個類DefaultClass,它是一個模板類。我們有很多種類 ,專門spec_traits特徵,讓我們打電話給他們SpecClass1 itp。 。 SpecClass#本身可以是 帶有一個參數的模板,如SpecClass2<T>。有沒有一種實施DefaultClass的方法,因此可以使用DefaultClass<SpecClass1>DefaultClass<SpecClass<SomeType>, SomeType>。我用專業化:模板模板參數或模板參數

// DefaultClass.hpp 
template<typename T> 
class _phonyTemplate; 
class _phonyType; 
class _phonyNonTemplate; 

template <template <class> class TemplateT, class TypeT, class NonTemplateT> 
class DefaultClass; 

// for DefaultClass<SpecClass<SomeType>, SomeType> 
template <template <class> class TemplateT, class TypeT> 
class DefaultClass<TemplateT, TypeT, _phonyNonTemplate> 
{ 
    // use SpecClass# traits 
    typedef spec_traits<TemplateT<TypeT> >::some_type used_type; 
}; 


// for DefaultClass<SpecClass1> 
template <class NonTemplateT> 
class DefaultClass<_phonyTemplate, _phonyType, NonTemplateT> 
{ 
    // use SpecClass# traits 
    typedef spec_traits<NonTemplateT>::some_type used_type; 
}; 




// SpecClass1.hpp 
class SpecClass1 : public DefaultType<_phonyTemplate, 
              _phonyType, SpecClass1> {}; 

// SpecClass2.hpp 
template <typename TypeT> 
class SpecClass2 : public DefaultType<SpecClass2, 
              TypeT, _phonyNonTemplateT> {}; 

是否有更好的方法,然後使用這些_phony類型?

+1

挑剔:有沒有「模板類」,它是一個「類模板」。而一個類沒有專門的類模板。類模板專門用於模板參數的特定組合。 – pmr

回答

3

最簡單的方法似乎是爲規範類型爲SomeType提供一個typedef:

template <typename T> 
class DefaultClass 
{ 
    typedef typename T::SomeType SomeType; 
}; 

// SpecClass1.hpp 
class SpecClass1 : public DefaultType<SpecClass1> {}; 

// SpecClass2.hpp 
template <typename TypeT> 
class SpecClass2 : public DefaultType<SpecClass2<TypeT> > {}; 
+0

謝謝。我實際上嘗試過,但認爲這是由於其他錯誤worng。 –