#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
, поэтому я бы избегал этого в вашем случае, но вы можете создать столько специализаций, сколько вам нужно.
Хорошо то, что они не засоряют ваше объявление класса, но это также может вызвать проблемы с обслуживанием, если ваша специализация не очевидна.