2012-01-22 3 views
2

я пытаюсь сделать что-то вроде этого:Как передать параметры параметра шаблона шаблон

ClassA:

template < typename T1, typename T2 = int > 
class ClassA {}; 

ClassB использованием CLASSA как реализация хранения:

template 
< 
typename T, 
template < typename = T, typename = int > class Storage = ClassA 
> 
class ClassB : public Storage<T> {}; 

Теперь я я могу создать экземпляр класса В:

ClassB<double>   myClass; // Ok, using ClassA (implicit) with <double,int> (implicit) 
ClassB<double,ClassA> myClass2; // Ok, using ClassA (explicit) with <double,int> (implicit) 
ClassB<double,ClassA<double,int>> myClass3; // Not ok, can't using ClassA (explicit) with <double,int> (explicit) 

Как я могу параметризовать хранилище (ClassA) для ClassB?

ответ

2

Вы помещаете их в отдельный параметр. ClassA<double,int> - это уже тип, поэтому он не может использоваться для параметра шаблона шаблона.

template<typename T, 
     template <typename, typename> class Storage = ClassA, 
     typename StorageT1 = T, 
     typename StorageT2 = int> 
class ClassB : public Storage<StorageT1, StorageT2> {}; 

ClassB<double> myClass; 
ClassB<double, ClassA> myClass2; 
ClassB<double, ClassA, double, int> myClass3; 
+0

Спасибо вам за ответ. Разве нет другого решения? Это похоже на параметр шаблона 3. и 4 для ClassB, но они должны специализироваться на ClassA –

+0

@jisaak: Нет. Или это, либо сделать ClassA аргументами по умолчанию и использовать «ClassB >» во втором случае , – kennytm

+0

хорошо, спасибо. –