#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); }