2017-11-23 12 views
5

मैं एक कक्षा बनाना चाहता हूं जो टेम्पलेट पैरामीटर के साथ किसी अन्य वर्ग में पूरी तरह से परिवर्तनीय है।क्या सी ++ में टेम्पलेट प्रकार में टाइप रूपांतरण को कम करना संभव है?

#include <iostream> 

template <typename T> 
class A { 
    T value; 
public: 
    A(T value) {this->value = value;} 
    T getValue() const {return value;} 
}; 

class B { 
    int value; 
public: 
    B(int value) {this->value = value;} 
    operator A<int>() const {return A(value);} 
}; 

template <typename T> 
void F(A<T> a) {std::cout << a.getValue() << std::endl;} 

void G(A<int> a) {std::cout << a.getValue() << std::endl;} 

int main() 
{ 
    B b(42); 

    F(b);   // Incorrect 
    F((A<int>)b); // Correct 
    G(b);   // Also correct 
} 

यह F(b) उदाहरण काम करने के लिए करता है, तो दोनों class A और void F पुस्तकालय कार्यों हैं संभव है और modifyed नहीं किया जा सकता: यहाँ मैं क्या हासिल करना चाहते का MCE है?

+3

नहीं। आपके जैसे 'एफ' को कॉल करने का मतलब टेम्पलेट तर्क कटौती है। जो बदले में रूपांतरणों पर विचार नहीं किया जाता है। आप 'एफ (बी) 'कॉल कर सकते हैं। – StoryTeller

+1

डिज़ाइन और उपयोग-मामलों के आधार पर, शायद 'ए' से 'ए'' प्राप्त हो सकता है? शायद 'निजी 'विरासत का उपयोग कर? –

उत्तर

4

यह:

F(b); 

टेम्पलेट तर्क कटौती की आवश्यकता है। नतीजतन, यह वही नहीं करेगा जो आप चाहते हैं।

स्पष्ट तर्क टेम्पलेट गुजर, इस तरह का प्रयास करें:

F<int>(b); 

जब से तुम class B में एक () ऑपरेटर प्रदान करते हैं।

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

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