2016-10-14 2 views
0

Возможно ли, чтобы специализированная версия класса передавала некоторые или все функции исходного класса шаблона?Возможно ли, чтобы специализированная версия могла поделиться некоторыми функциями с исходным классом шаблона?

т.е. рассмотрим есть шаблонный класс,

template <typename T> 
class A 
{ 
    A() 
    {} 
    A(const A& ref) 
    {} 
    void f1() 
    { 
     //do something 
    } 
    void f2() 
    { 
     //do something 
    } 
    void f3() 
    { 
     //do something 
    } 
} 

и имеет специальную версию для конкретного типа данных, которые только намереваются добавить некоторые функциональные возможности присоединения к общей версии в дополнение оригинальные общие функциональные возможности.

template<> 
class A<int> 
{ 
    void f4() 
    { 
     //do something 
    } 
} 

теперь, что я конкретно хочу, что это специализированная версия для делить все, от его общей версии, включая конструкторов, если это возможно.

+2

Возможно, наследование - лучший выбор здесь? –

+0

Нет, это невозможно так прямо, как вы хотите. Имейте это в виду: каждая специализированная специализация - это отдельное определение класса с другим типом (таким образом, имя (для компилятора, независимо от того, имеют ли они имя с тем же именем). –

+0

Если вы не знаете, специализируются на отдельных функциях шаблона класса, не специализируясь на всем классе. –

ответ

1

Это, как правило, можно осуществить это путем перестройки иерархии классов:

template <typename T> 
class A_base 
{ 
    // All the f1() functions, et. al, implemented here 
}; 

template<typename T> class A : public A_base<T> { 

public: 

    // An empty shell of a class, with the constructor 
    // forwarding its arguments to the superclass. 

    template<typename ...Args> A(Args && ...args) 
      : A_base(std::forward<Args>(args)...) 
    { 
    } 
}; 

template<> 
class A<int> : public A_base<int> 
{ 
    // Same constructor. 

    void f4() 
    { 
     //do something 
    } 
}; 

Вы в конечном итоге перемещение всех методов класса, членов класса, в базовый класс, с шаблонного класса, состоящий из не более чем вывода из шаблона базового класса; и пустым фасадом в противном случае.

Тогда ваша специализация происходит из базового класса таким же образом и добавляет свои собственные методы.

Другой альтернативой является реализация такого рода деривации «назад».

// Empty template class. 

template<typename T> class A_extra {}; 

// Your specialization, with the extra method: 

template<> 
class A_extra<int> { 

    void f4() 
    { 
    } 
}; 

// And the template class inherits from it: 

template<typename T> class A : public A_extra<T> { 

    // Your template class 
}; 

В зависимости от конкретных деталей вашего шаблона, один или другой подход должен работать; или некоторые вариации на ту же тему.

 Смежные вопросы

  • Нет связанных вопросов^_^