2011-05-27 11 views
5

Derived में template foo(T) है। में foo() के 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); 

क्या यह संभव है? ऊपर सिर्फ एक उदाहरण है।

+1

आपके विचार के लिए: क्या इन सभी कार्यों का वास्तव में वही नाम होना चाहिए? –

+0

@ क्रिस, हाँ। 'बेस' ऑब्जेक्ट्स के लिए, 'foo() '' int'/'double' पारित किया गया है। 'व्युत्पन्न' ऑब्जेक्ट्स के लिए 'foo() 'किसी भी प्रकार से गुजरता है लेकिन इसमें' foo (double)' के लिए अलग गणना होती है। यह सिर्फ एक उदाहरण है। – iammilind

उत्तर

6

using सभी ओवरलोड को दायरे में लाता है। बस व्युत्पन्न वर्ग में छुपा है, यह लिखने के लिए थोड़ा अधिक है, लेकिन काम करता है:

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

काफी एक साफ तरीका यह है कि आप टेम्पलेट दृष्टिकोण के साथ ints के लिए अपने टेम्पलेट विशेषज्ञ है रखना चाहते हैं:

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

सब कुछ using साथ में लाया जाएगा तो मैं अपने मामले में इससे बचने के हैं, लेकिन जैसा कि आप की जरूरत आप के रूप में कई विशेषज्ञताओं बना सकते हैं।

अच्छी बात यह है कि वे आपकी कक्षा की घोषणा को कूड़े नहीं देते हैं, लेकिन यदि आपकी विशेषज्ञता स्पष्ट नहीं है तो यह रखरखाव की समस्या भी ला सकता है।

संबंधित मुद्दे