在Derived
中有一个template foo(T)
。 foo()
中有Base
的2次重载。
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);
有可能吗?以上只是一个例子。
答案 0 :(得分:6)
using
将所有重载都纳入范围。只需将其隐藏在派生类中,写入更多内容即可完成工作:
struct Derived : Base
{
template<typename T> void foo (T x) {}
void foo(int x){
Base::foo(x);
}
};
答案 1 :(得分:1)
如果你想继续使用模板方法,那么相当简洁的方法是将你的模板专门用于整理:
template<> void Derived::foo<int> (int x) { Base::foo(x) };
所有内容都将通过using
引入,因此我会在您的情况下避免这种情况,但您可以根据需要创建任意数量的专业化。
好处是他们不会丢弃你的课堂声明,但如果你的专业化不明显,这也会带来维护问题。