5

अगर मैं एक सामान्य struct/वर्ग है:बिल्टिन प्रकारों जैसे अंकगणितीय संचालन के लिए दो टेम्पलेट प्रकारों को कैसे बढ़ावा देना है?

template<typename T> 
struct Container 
{ 
    T value; 
    Container(const Value& value) : value(value) { } 
}; 

और मैं उनमें से दो पर कार्रवाई करना चाहते हैं:

template<typename T, typename U> 
Container<T> operator+(const Container<T>& lhs, const Container<U>& rhs) 
{ 
    return Container<T>(lhs.value + rhs.value); 
} 

समस्या यह है कि lhs प्रकार की है अगर Container<int> और rhsContainer<float> प्रकार का है, तो मुझे Container<int> वापस मिल जाएगा। लेकिन अगर मैं auto result = 2 + 2.0f करना चाहता था, तो resultfloat टाइप करना होगा। तो व्यवहार बिल्टिन प्रकारों और कस्टम प्रकारों के बीच असंगत है।

तो मैं operator+ अधिभार कैसे ले सकता हूं और इसे Container<float> वापस कर सकता हूं, जैसे सी ++ बिल्टिन प्रकारों के साथ अंकगणितीय पदोन्नति को कैसे प्रबंधित करता है?

+0

आप सी ++ 11 का उपयोग कर सकते हैं? –

+0

@PiotrSkotnicki हां। – Therhang

उत्तर

5

जहां तक ​​आप दो प्रकार के टेम्पलेट में से एक का उपयोग करते हैं, तो आप योग के परिणाम पर एक कलाकार को प्रेरित करने का जोखिम रखते हैं। उदाहरण के तौर पर, यदि आप गलती से अपने लक्ष्य प्रकार के रूप में int चुनते हैं, भले ही float में योग परिणाम, तो इसे चयनित प्रकार पर डाला जाएगा।

वैसे भी, सी ++ 11 के बाद से, आप चोर decltype विनिर्देशक पर ऊपर के उदाहरण में के रूप में भरोसा करते हैं (या कम से कम हो, तो आप Container::T और Container::U एक प्रकार के होते हैं, जिसके लिए + ऑपरेटर परिभाषित किया गया है कर सकते हैं)।

मैंने autooperator+ के लिए वापसी मूल्य के रूप में भी निर्दिष्ट किया है, क्योंकि यह सी ++ 14 से शुरू होने पर हमारे निपटान में है और यह वास्तव में वास्तव में उपयोगी है।

यह उल्लेख ऊपर काम कर रहे उदाहरण इस प्रकार है:

#include <iostream> 
#include <vector> 

template<typename T> 
struct Container 
{ 
    T value; 
    Container(const T& value) : value(value) { } 
}; 

template<typename T, typename U> 
auto operator+(const Container<T>& lhs, const Container<U>& rhs) 
{ 
    return Container<decltype(lhs.value+rhs.value)>{lhs.value + rhs.value}; 
} 

int main() 
{ 
    Container<int> c1{1}; 
    Container<float> c2{0.5}; 
    std::cout << (c1+c2).value << std::endl; 
} 
+1

अच्छा लग रहा है। आप टेम्पलेट तर्क को कम करने की अनुमति देने वाले 'make_container' सहायक फ़ंक्शन के साथ इसे और अधिक पठनीय बना सकते हैं:' वापसी make_container (lhs.value + rhs.value); ' – hvd

+0

अच्छा बिंदु, मैं इसे होमवर्क के रूप में छोड़ दूंगा ...: -) – skypjack

+0

क्या 'decltype' में किए गए ऑपरेशन द्वारा कोई अतिरिक्त रनटाइम लागत जोड़ा गया है? क्या यह बेहतर होगा अगर मैंने परिणाम को एक अस्थायी 'ऑटो' चर में संग्रहीत किया हो और केवल 'वापसी कंटेनर (परिणाम); '? – Therhang

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