दो तारों को स्वैप करने के लिए टेम्प्लेटेड फ़िक्शन का उपयोग करने की कोशिश कर रहा है


9
#include<iostream>
#include<string>

template <typename T>
void swap(T a , T b)
{
  T temp = a;
  a = b;
  b = temp;
}

template <typename T1>
void swap1(T1 a , T1 b)
{
  T1 temp = a;
  a = b;
  b = temp;
}

int main()
{
  int a = 10 , b = 20;
  std::string first = "hi" , last = "Bye";

  swap(a,b);
  swap(first, last);   

  std::cout<<"a = "<<a<<" b = "<<b<<std::endl;
  std::cout<<"first = "<<first<<" last = "<<last<<std::endl;    

  int c = 50 , d = 100;
  std::string name = "abc" , surname = "def";

  swap1(c,d);
  swap1(name,surname);

  std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
  std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;    

  swap(c,d);
  swap(name,surname);

  std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
  std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;    

  return 0;
}

**Output**
a = 10 b = 20
first = Bye last = hi
c = 50 d = 100
name = abc surname = def
c = 50 d = 100
name = def surname = abc

दोनों swap()और swap1()मूल रूप से एक ही फ़ंक्शन-परिभाषाएँ हैं फिर केवल swap()स्ट्रिंग्स को स्वैप क्यों swap1()करता है , जबकि नहीं करता है?

क्या आप मुझे यह भी बता सकते हैं कि stl स्ट्रिंग्स को डिफॉल्ट रूप से तर्क के रूप में कैसे पास किया जाता है, क्या वे वैल्यू या रेफरेंस द्वारा पास किए जाते हैं?


4
Std :: swap में क्या गलत है ?
जेसपर जुहल

1
इसमें कुछ भी गलत नहीं है। मैं templatized कार्यों के बारे में सीख रहा था। इसलिए मैंने यह कोड सिर्फ अभ्यास करने के लिए लिखा था लेकिन आउटपुट ने मुझे भ्रमित कर दिया।
गेटबेरप्रोग्रामर

जवाबों:


9

मैं देख सकता हूं कि लोग अब एडीएल पर क्यों फिदा हो रहे हैं ...

आप जो देखते हैं वह तर्क निर्भर लुकअप का प्रभाव है । यदि आप अपने swapकार्यान्वयन के अंदर एक प्रिंट जोड़ते हैं , तो आप देखेंगे कि इसे केवल इसके लिए नहीं बुलाया गया है ।std::stringint

std::swapआपके संस्करण पर पसंद किया जाता है, क्योंकि प्रकार के लिए एक स्पष्ट विशेषज्ञता मौजूद है std::basic_string। यदि यह मौजूद नहीं था, तो कॉल शायद अस्पष्ट होगा।
के लिए int, नाम स्थान std, देखने की प्रक्रिया में नहीं माना जाता है तो अपने संस्करण केवल स्वीकार्य है।

क्या आप मुझे यह भी बता सकते हैं कि stl स्ट्रिंग्स को डिफॉल्ट रूप से तर्क के रूप में कैसे पारित किया जाता है, क्या वे मान द्वारा या संदर्भ द्वारा पारित किए जाते हैं?

C ++ में सब कुछ मूल्य द्वारा पारित किया जाता है, जब तक कि आप इसे स्पष्ट रूप से पास-बाय-संदर्भ के रूप में चिह्नित नहीं करते हैं।


इस कोड की जाँच यहाँ: pastebin.com/E257yw04 । मेरा कार्य swap1 () स्ट्रिंग्स के लिए कहा जाता है, लेकिन केवल एक बार। ऐसा क्यों है?
बीट्टरप्रोग्राममर

@dumb_programmer आपके पास कोड में स्वैप करने के लिए दो कॉल हैं (एक के लिए intऔर एक के लिए std::string), और इसलिए दो कॉल प्रिंट होते हैं। के swapसाथ दो कॉल हैं std::string, और उन का उपयोग करें std::swap(कोई प्रिंट नहीं)।
यिकिसार्विनन

समझ गया!! बहुत बहुत धन्यवाद।
बीट्टरप्रोग्राममर

@dumb_programmer साइड नोट: कृपया अपने आप को गूंगा मत कहो। इस काम में इम्पोस्टर सिंड्रोम आम है, लेकिन प्रोग्रामर का वास्तविक मूल्य "वह कितना जानता है" नहीं है, बल्कि "वह कितना सीखने को तैयार है"। आपको कुछ समझ में नहीं आया, इसलिए आप बाहर पहुँच गए और पूछा - यह (कोर्स के पहले गुग्लिंग के बाद) करने के लिए सबसे अच्छी संभव कार्रवाई है।
यक्षिसर्विनन

हाँ मैं रोज़ बेहतर हो रहा हूँ! आपके उत्तर के लिए धन्यवाद @Yksisarvinen मैं जल्द ही अपना उपयोगकर्ता नाम बदलूंगा।
बीटेट्रप्रोग्रामर

0

आप मान से पैरामीटर पारित कर रहे हैं। आपको उन्हें संदर्भ द्वारा पास करना होगा:

template <typename T> void myswap(T& a , T& b);

या - अधिक सामान्यतः - वैश्विक (प्रतिद्वंद्विता) संदर्भ द्वारा:

template <typename T> void myswap(T&& a , T&& b);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.