2012-03-24 13 views
6

मैं निम्नलिखित कार्य हो:वापसी प्रकार वास्तव में लंबे समय से अभिव्यक्ति

inline auto iterateSomething(obj & o) 
{ 
    auto iterators = baseIterator(o); 
    auto tranformer = boost::bind(transofrmToSomething, _1, o); 
    typedef boost::transform_iterator<decltype(tranformer), decltype(iterators.first)> iterator_t; 
    iterator_t begin(iterators.first, tranformer); 
    iterator_t end(iterators.second, tranformer); 
    return std::make_pair(begin, end); 
} 

आप देख सकते हैं मैं वापसी मान पता नहीं है और यहां तक ​​कि अगर मैं पूर्णांक वहाँ और बाद में डाल त्रुटि संदेश से प्रकार की नकल, यह वास्तव में एक लंबा प्रकार है ...
क्या रिटर्न प्रकार को फ़ंक्शन में केवल वापसी के प्रकार के रूप में निर्दिष्ट करने का कोई तरीका है? क्या कोई कामकाज रिटर्न प्रकार में एक विशाल प्रकार शामिल नहीं है?

+0

typedefs अपने मित्रों को कर रहे हैं, आप भी वापसी प्रकार की गणना करने के लिए एक metafunction निर्धारित कर सकते हैं। – enobayram

+7

आप फ़ंक्शन के बाहर टाइपपीफ को स्थानांतरित कर सकते हैं। फिर आप रिटर्न प्रकार घोषित करने के लिए इसका उपयोग कर सकते हैं। –

उत्तर

2

मुझे लगता है कि तुम क्या रेमंड चेन एक टिप्पणी में सुझाव दिया करना चाहिए:

ले जाएँ समारोह के बाहर typedefs। फिर आप रिटर्न प्रकार घोषित करने के लिए इसका उपयोग कर सकते हैं।

तो रेमंड एक जवाब यह मेरा वरीयता में स्वीकार किया जाना चाहिए पोस्ट - मैं इस पोस्टिंग ताकि bitmask का जवाब केवल एक ही नहीं है, के बाद से मुझे लगता है कि यह रोग से एक इलाज भी बदतर है।

0

इस बारे में क्या है, यदि आप नहीं करना चाहते हैं कि आपके typedef बाहर चले गए।

auto getIt = [] (obj& o, bool getEnd) { 
    return boost::transform_iterator< 
      decltype(boost::bind(transofrmToSomething, _1, o)), 
      decltype(baseIterator(o).first) 
     >(
      getEnd ? baseIterator(o).second : baseIterator(o).first, 
      boost::bind(transofrmToSomething, _1, o) 
     ); 
} 

auto iterateSomething = [] (obj & o) { 
    return std::make_pair(getIt(o,false), getIt(o,true)); 
} 
+0

पुनरावृत्ति के लिए पैरामीटर नहीं होना चाहिए कुछ [] के बाद आते हैं? –

+0

@VaughnCato: अच्छा पकड़, धन्यवाद! मैंने इसे एक फ़ंक्शन से बदल दिया और पैरामीटर सूची को स्थानांतरित करने के लिए भूल गए। बदला हुआ। – bitmask

+0

यह एक सी ++ minefield है: एक टर्नरी ऑपरेटर, जादू _1 (दो बार!), एक बूल पैरामीटर जिसे अभी तक एक चयनकर्ता के रूप में उपयोग किया जाता है, एक वैरिएबल जिसे ओ_1 के ठीक आगे कहा जाता है, decltype (दो बार!), ऑटो (दो बार !), लैम्ब्डा एक्सप्रेशन (दो बार!), और मुझे अभी भी यकीन नहीं है कि यह पूरी तरह से ठीक है कि कैसे "पहले" पर decltype का उपयोग किया जा रहा है, न कि "दूसरा।" यह शायद ही स्पष्ट है कि कार्यक्षमता यहां भी प्रस्तुत की जा रही है, और अब यह पूरी तरह से अभेद्य है। क्या करें रेमंड चेन ने कहा - भविष्य के रखरखाव आपको धन्यवाद देंगे। –

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