C : Создание экземпляра шаблонного метода на основе перегрузок другого метода

#c #templates #overloading #template-instantiation

Вопрос:

У меня есть метод (в классе A), который имеет множество различных перегрузок, и я создаю класс B, который наследуется от A, изменяя поведение метода для выполнения определенного действия, прежде чем делать то, что он изначально делает. Проблема в том, что это изменение должно быть сделано для всех перегрузок, что можно сделать с помощью шаблона.

 class A{  public:  void method(int);  void method(double);  void method(char); };  class B : protected A{  public:  templatelt;typename Tgt;  void method(T t){  A::method(t);  } };  

На самом деле это действительно работает, но использование шаблона подразумевает размещение нового кода метода в объявлении класса (т. Е. в заголовке), что довольно запутанно, и я чувствую, что должен быть способ поместить код в отдельный файл. Есть способ сделать это, и это было бы просто переместить код переопределенного метода B::method() в отдельный файл и создать его вручную для каждой перегрузки. Что довольно утомительно, если количество перегрузок становится большим, и кажется довольно неестественным. Итак, отсюда мой вопрос : есть ли способ напрямую указать компилятору создать экземпляр шаблонного метода B::method() для каждого типа, для которого он был бы допустим ? (т. Е. Для каждого типа A::метод перегружен)

Ответ №1:

Вы можете использовать using Base::member_id; для раскрытия членов частных/защищенных баз:

 class A{  public:  void method(int);  void method(double);  void method(char); };  class B : protected A{  public:  using A::method; };  int main() {  B foo;   foo.method(12); }