2012-03-30 3 views
2

Можно ли специализировать класс шаблона для принятия дополнительных параметров шаблона?C++ специализирует класс шаблона для принятия дополнительного параметра шаблона

Например:

template <typename T> 
struct X { 
    void foo() { cerr << "Generic" << endl;} 
}; 


template <> 
template <bool b> 
struct X<int> { 
    void foo() { cerr << "Specialization" << endl;} 
}; 

Я не мог сделать вышеупомянутую работу с г ++, но может быть, есть какой-то подвох, который сделает эту работу.

Edit: Я не хочу, чтобы переместить шаблон <bool b> к базовому шаблону X, потому что это особенность только X<int>. Если я должен, есть способ, которым я могу позволить пользователям не требуется указывать какие-либо значения для этого? Мне бы очень понравился подход, который не идет по этому маршруту.

+0

Слышали ли вы о частичной специализированной специализации? –

+2

"* Если мне нужно, есть ли способ, которым я могу позволить пользователям не указывать какие-либо значения для него? *« Да - параметры шаблона по умолчанию. Например. 'template '. – ildjarn

+1

Как сказал @ildjarn, вы можете - но я бы предупредил, что в большинстве случаев лучше использовать какой-то другой тип, кроме bool. 'mytempl ' vs. 'myempl ' обычно более значим, чем 'mytempl ' vs. 'mytempl '. –

ответ

2

Вы можете изменить свой основной шаблон принять класс прокси черты вместо:

template <typename T> 
struct Foo 
{ 
    typedef typename T::type type; 

    // work with "type" 

    void static print() { std::cout << T::message << std::endl; } 
} 

Затем определить класс признака:

template <typename T> 
struct traits 
{ 
    typedef T type; 
    static const char * const message = "Generic"; 
}; 

Теперь вы можете создать экземпляр Foo<traits<double>> и Foo<traits<int>>, и вы можете инкапсулировать дополнительное поведение в классе признаков, которое вы можете специализировать по мере необходимости.

template <> 
struct traits<int> 
{ 
    typedef int type; 
    static const char * const message = "Specialized"; 
}; 
+0

Для этого не нужно менять основной шаблон. Просто сделайте специализацию, которая примет «черты '. –