2016-08-01 8 views
5

मुझे लगता है कि मैं हल करने के लिए पता नहीं कैसे एक उचित रूप में सरल सवाल है।खाका ओवरलोडिंग (संदर्भ और गैर संदर्भ संस्करण)

कल्पना कीजिए निम्नलिखित टेम्पलेट विधि

template<typename T> void Add(T& var); 

जहां विशेषज्ञताओं एक कंटेनर (एक तरह से) के लिए कुछ जोड़ सकते हैं। मैं strings तरह POD या अधिक जटिल प्रकार में पारित कर सकते हैं और यही वजह है कि मैं एक संदर्भ के रूप में टी गुजर रहा हूँ।

इस के साथ समस्या यह है कि जब भी मैं फोन करने के लिए (...) की तरह एक और तरीका का एक परिणाम के साथ जोड़े चाहते हैं:

Add(MethodThatReturnsAnInt()); 

यह काम नहीं करेगा और एक अस्थायी चर धारण करने के लिए की जरूरत है MethodThatReturnsAnInt() का परिणाम।

वहाँ Add अधिक भार इतना है कि मैं एक संदर्भ गुजर और गैर संदर्भ गुजर संस्करण हो सकता है की कोई तरीका है?

template<typename T> void Add(T& var); 
template<typename T> void Add(T var); 

std::enable_if इस स्थिति में किसी काम के हो सकते हैं?

+0

[रावल संदर्भ] (http://en.cppreference.com/w/cpp/language/reference) के बारे में पढ़ें और जानें। –

+0

गूगल _forwarding reference_। आपकी स्थिति और परिणामी प्रश्न इतना आम थे कि उन्होंने इसके लिए एक भाषा सुविधा जोड़ा। ;-) यह सी ++ 11 की मूलभूत विशेषता है और शायद पहले से ही पर्याप्त समय का उत्तर दिया गया है। –

+0

क्या समस्या आप वास्तव में हल करने की कोशिश कर रहे हैं? 'जोड़ें() 'क्या करता है? – Barry

उत्तर

6

आप एक सी ++ 11 संकलक है, तो आप एक (Universal Reference)अग्रेषण संदर्भ इस्तेमाल कर सकते हैं:

template<typename T> void Add(T&& var) {} 

int MethodThatReturnsAnInt() { return 42; } 

int main() 
{ 
    int a = MethodThatReturnsAnInt(); 

    Add(a);      // lvalue passed: void Add(int& var) takes lvalue reference 
    Add(MethodThatReturnsAnInt()); // rvalue passed: void Add(int&& var) takes rvalue reference 
} 

T&& इस उदाहरण में एक rvalue संदर्भ नहीं है। एक प्रकार-बात का अनुमान लगाना संदर्भ T&& में एक विशेष अर्थ नहीं है। T इस प्रकार अभिव्यक्ति समारोह Add() के लिए पारित किया पर निर्भर करता है: अभिव्यक्ति एक lvalue है

  • हैं: प्रकार E की (जैसे a), तो टी E& को निष्कर्ष निकाला है।

  • अभिव्यक्ति एक rvalue है: प्रकार E की (जैसे मूल्य एक समारोह से वापस लौटे), तो टी E और var को निष्कर्ष निकाला प्रकार E&& होगा है।

+0

यह @SamVarshavchik ने क्या कहा है (इस तथ्य के अलावा कि आप पुराने नाम वाले नाम _universal context_ का उपयोग कर रहे हैं) से अलग कैसे हैं? इसके अलावा, उदाहरण किसी भी तरह गलत और भ्रामक दिखता है। – skypjack

+0

दूसरा कॉल वास्तव में 'जोड़ें (int && var) 'है,' जोड़ें (int var)' नहीं। यह 'int' के लिए समान हो सकता है, लेकिन अधिक जटिल वर्ग के लिए नहीं। – Holt

+2

@skypjack सैम नाम ने एक शब्द छोड़ा जिसे आप Google के लिए उपयोग कर सकते हैं और कहीं और मदद से समस्या का समाधान कर सकते हैं। सर्जी ने एक उत्तर पोस्ट किया जो समस्या को हल करता है। – Yakk

2

यदि आपका कंपाइलर पहले से ही C++ 11 का समर्थन नहीं करता है, तो आपको अपने कंपाइलर को अपडेट करने की आवश्यकता होगी, और फिर अग्रेषण संदर्भ, && का उपयोग करना होगा।

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