Возможно ли использовать ключевое слово для наследования меньшего количества функций? - PullRequest
5 голосов
/ 27 мая 2011

В Derived есть template foo(T). Есть 2 перегрузки foo() в 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 объектом; Я хочу использовать только 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);

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

Ответы [ 2 ]

6 голосов
/ 27 мая 2011

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

struct Derived : Base
{
  template<typename T> void foo (T x) {}
  void foo(int x){
    Base::foo(x);
  }
};
1 голос
/ 27 мая 2011

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

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

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

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

...