Возможно ли, чтобы ключевое слово «using» наследовало меньше функций?

#c #inheritance #using

#c #наследование #использование

Вопрос:

В Derived есть template foo(T) . Существует 2 перегрузки foo() in Base .

 struct Base
{
  void foo (int x) {}
  void foo (double x) {}
};

struct Derived : Base
{
  template<typename T> void foo (T x) {}
  using Base::foo;
};
  

Теперь, когда foo() вызывается с Derived помощью object; Я хочу использовать только Base::foo(int) , если это применимо, в противном случае оно должно вызывать Derived::foo(T) .

 Derived obj;
obj.foo(4);  // calls B::foo(int)
obj.foo(4.5); // calls B::foo(double) <-- can we call Derived::foo(T) ?
  

Короче говоря, я хочу, чтобы эффект:

 using Base::foo(int);
  

Возможно ли это? Выше приведен только пример.

Комментарии:

1. На ваше рассмотрение: действительно ли все эти функции должны иметь одинаковое имя?

2. @Крис, да. Для Base объектов foo() передается int / double . Для Derived объектов foo() передается любой тип, но для него выполняются разные вычисления foo(double) . Это всего лишь пример.

Ответ №1:

using переносит все перегрузки в область видимости. Просто спрячьте его в производном классе, его немного сложнее написать, но он выполняет свою работу:

 struct Derived : Base
{
  template<typename T> void foo (T x) {}
  void foo(int x){
    Base::foo(x);
  }
};
  

Ответ №2:

Довольно удобный способ сделать это, если вы хотите придерживаться шаблонного подхода, — специализировать свой шаблон для целых чисел:

 template<> void Derived::foo<int> (int x) { Base::foo(x) };
  

Все будет добавлено с using , поэтому я бы избегал этого в вашем случае, но вы можете создать столько специализаций, сколько вам нужно.

Хорошо то, что они не засоряют ваше объявление класса, но это также может вызвать проблемы с обслуживанием, если ваша специализация не очевидна.