2015-10-25 32 views
5

द्वारा पारित किया गया मैंने एक साधारण विविध टेम्पलेट फ़ंक्शन लिखा और मैं यह समझने की कोशिश कर रहा हूं कि यह क्यों काम नहीं करता है। (इसका उत्पादन समकक्ष पूरी तरह से काम करता है।)पैरामीटर पैक संदर्भ

#include <iostream> 

void read() {} 

template<class curr_t, class... rest_t> 
void read(curr_t &var, rest_t... rest) 
{ 
    std::cin >> var; 
    read(rest...); 
} 

int main() 
{ 
    int a = 0, b = 0, c = 0; 

    read(a, b, c); //input: 1 2 3 
    std::cout << a << b << c; //output: 1 0 0 

    std::cin.ignore(); 
    std::cin.get(); 
}  
a b c के लिए

टिप्पणियों से देखा जा सकता है, मैं इनपुट और आउटपुट 1 2 3 मैं 1 0 0 है। जैसा कि यह स्पष्ट है, केवल a इसके मूल्य को बचाता है। क्या कोई यह समझा सकता है कि ऐसा क्यों होता है और मैं इसे ठीक करने के लिए क्या कर सकता हूं? धन्यवाद!

EDIT :: हाँ, जाहिर है कि मेरे पास पैरामीटर पैक की अवधारणा गलत थी! मैं निम्नलिखित करने का भी प्रयास कर रहा था: rest_t... &rest जो मुझे एक कंपाइलर त्रुटि देता है।

इसके बजाय यदि मैं rest_t&... rest लिखता हूं तो यह इरादा के रूप में कार्य करता है। मुझे लगता है कि यह मेरी तरफ सिर्फ एक वाक्यविन्यास त्रुटि थी! किसी ने भी इसे उत्तर के रूप में पोस्ट करने के लिए धन्यवाद और एक मिनट बाद उसका जवाब हटा दिया! डी:

+4

शायद इसे मूल्य से पारित 'आराम' के साथ करना है? – LogicStuff

+0

क्या आपको नहीं लगता कि फ़ंक्शन 'रीड' असीमित रूप से रिकर्स करता है? – vishal

+0

लेकिन जैसा कि मैं इसे समझता हूं, पैरामीटर पैक "अनपैक" के रूप में, पैक के पहले तत्व (इस मामले में) curr_t और var बन जाता है। – DeiDei

उत्तर

5

a संदर्भ द्वारा पारित किया गया है लेकिन अन्य की प्रतिलिपि बनाई गई है: जब आप इसे दोबारा कॉल करते हैं, तो वे संदर्भ में लेते हैं, लेकिन वे मान द्वारा पहले पारित एक चर को संदर्भित करते हैं, इसलिए इसे बाहरी रूप से संशोधित नहीं किया जाएगा ।

template<class curr_t, class... rest_t> 
void read(curr_t &var, rest_t&... rest) 
//       ^    
{ 
    std::cin >> var; 
    read(rest...); 
} 
संबंधित मुद्दे