2011-05-27 73 views
5

Derivedtemplate foo(T)Base中有2個過載foo()「使用」關鍵字可能會繼承較少的功能嗎?

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

這可能嗎?以上只是一個例子。

+1

爲了您的考慮:所有這些功能是否應該具有相同的名稱? – 2011-05-27 08:51:14

+0

@克里斯,是的。對於'Base'對象,'foo()'傳遞'int' /'double'。對於'Derived'對象,'foo()'是通過任何類型傳遞的,但對於'foo(double)'有不同的計算。這只是一個例子。 – iammilind 2011-05-27 08:53:57

回答

6

using bringes所有重載到範圍。只需把它隱藏在派生類中,它是多一點來寫,但這項工作:

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

相當整潔的方式,如果你想保持與模板的方法是專門的模板整數做到這一點:

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

一切都將被帶到與using,所以我會避免這種情況,你的情況,但你需要,你可以創建多專業。

好處是他們不會亂扔你的類聲明,但如果你的專業化不明顯,這也會帶來維護問題。