2013-01-18 15 views
5

एक लैम्ब्डा के लिए एक तत्व पासिंग एक एल्गोरिथ्म के अंदर, मैं एक लैम्ब्डा कि संदर्भ-टू-स्थिरांक द्वारा एक तत्व को स्वीकार करता है बनाना चाहते हैं, :द्वारा संदर्भ-टू-स्थिरांक

Error: »const«-qualifier cannot be applied to »int&« (translated manually from German)

तब मुझे एहसास हुआ कि decltype(*it) पहले से ही एक संदर्भ है, और निश्चित रूप से उन const नहीं बनाया जा सकता। अगर मैं const को हटाता हूं, तो कोड संकलित करता है, लेकिन मैं असफल होने के लिए x = x चाहता हूं।

हमें एक मिनट के लिए प्रोग्रामर (जो मुझे है) पर भरोसा करें और const से छुटकारा पाएं और स्पष्ट &, जिसे संदर्भ ढहने वाले नियमों के कारण छोड़ दिया गया है, वैसे भी। लेकिन प्रतीक्षा करें, decltype(*it) वास्तव में एक संदर्भ होने के लिए की गारंटी है, या मुझे सुरक्षित पक्ष में रहने के लिए स्पष्ट & जोड़ना चाहिए?

हम प्रोग्रामर पर भरोसा नहीं करते हैं, तो मैं दो समाधान समस्या को हल करने में सोच सकते हैं:

(const typename std::remove_reference<decltype(*it)>::type& x) 

(const typename std::iterator_traits<Iterator>::value_type& x) 

आप खुद के लिए तय कर सकते हैं जो एक भद्दा है। आदर्श रूप में, मैं एक ऐसा समाधान चाहता हूं जिसमें कोई टेम्पलेट मेटा-प्रोग्रामिंग शामिल न हो, क्योंकि मेरे लक्षित दर्शकों ने पहले कभी नहीं सुना है। तो:

प्रश्न 1: decltype(*it)& हमेशा decltype(*it) जैसा ही है?

प्रश्न 2: मैं टेम्पलेट मेटा-प्रोग्रामिंग के बिना संदर्भ-टू-कॉन्स्ट द्वारा तत्व कैसे पास कर सकता हूं?

+2

एक अंग्रेजी त्रुटि अच्छा होगा! :) – Pubby

+0

@ पब्बी मैंने अपनी पूरी कोशिश की, सही करने के लिए स्वतंत्र महसूस करें :) – fredoverflow

+0

@sehe सवाल शीर्ष-स्तरीय आधार के बारे में नहीं है। –

उत्तर

4

प्रश्न 1: नहीं, इनपुट इटरेटर पर आवश्यकता केवल *it टी (तालिका 72, "इटरेटर आवश्यकताओं" में परिवर्तनीय है)।

तो decltype(*it) उदाहरण के लिए एक इटरेटर जिसका value_typeint है के लिए const char& हो सकता है। या यह int हो सकता है। या double

iterator_traits का उपयोग decltype का उपयोग करने के बराबर नहीं है, यह तय करें कि आप क्या चाहते हैं।

इसी कारण से, auto value = *it; आवश्यक रूप से आपको इटरेटर के मान प्रकार के साथ एक चर प्रदान करता है।

प्रश्न 2: टेम्पलेट मेटा-प्रोग्रामिंग द्वारा आपका क्या मतलब हो सकता है पर निर्भर हो सकता है।

यदि किसी विशेषता प्रकार का उपयोग टीएमपी है, तो टीएमपी के बिना "इटरेटर के मूल्य प्रकार के संदर्भ में संदर्भ" निर्दिष्ट करने का कोई तरीका नहीं है, क्योंकि iterator_traits एक मनमाना इटरेटर के मान प्रकार तक पहुंचने का एकमात्र माध्यम है।

यदि आप decltype को कॉन्स्ट-इफ़ी करना चाहते हैं तो इसके बारे में कैसे?

template<typename Iterator> 
void solve_world_hunger(Iterator it) 
{ 
    const auto ret_type = *it; 
    auto lambda = [](decltype(ret_type)& x){ 
     auto y = x; // this should work 
     x = x;  // this should fail 
    }; 
} 

आप अपने प्रकार का उपयोग करने के क्रम में ret_type कब्जा करने के लिए, मैं आसानी से इस समय जांच नहीं कर सकता हो सकता है।

दुर्भाग्य से यह एक अतिरिक्त समय को पुनरावृत्त करता है। आप इससे बचने के लिए शायद कुछ चालाक कोड लिख सकते हैं, लेकिन चालाक कोड remove_reference का वैकल्पिक संस्करण बन जाएगा, इसलिए टीएमपी।

+0

ठीक है, मैं बुलेट काट दूंगा और फिर 'iterator_traits' समझाऊंगा। – fredoverflow

+0

@FredOverflow: एक पुस्तक/ट्यूटोरियल लिखना? –

+0

नहीं। अगर मैंने एक किताब लिखी, तो मुझे यकीन है कि लाउंज जानना सबसे पहले होगा;) – fredoverflow

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