2010-06-22 17 views
5

< अद्यतन > मेरे लिए सामान्य रूप से, सवाल गलत था। वास्तविक सवाल यह है: UnaryFunc :: result_type को सीधे एक्सेस करने के बजाय, वापसी प्रकार निर्धारित करने के लिए रूपांतरण परिणाम_of <> मेटाफंक्शन का उपयोग नहीं करता है। चारों ओर एक काम के साथ एक जवाब पोस्ट किया। </अपडेट >बूस्ट :: transform_iterator के साथ फीनिक्स अभिव्यक्ति का उपयोग कैसे करें?

विशेष रूप से, वहाँ एक फोनिक्स अभिव्यक्ति एक result_type प्रकार का पर्दाफाश के रूप में std :: unary_function अवधारणा के लिए उम्मीद करने के लिए एक तरीका है? boost :: transform_iterator यह अपेक्षा करता है, और इसके स्रोत को देखने से, मुझे चारों ओर एक साधारण काम नहीं दिख रहा है।

यहाँ कुछ कोड है कि समस्या मैं कर रहा किया गया है reproduces है:

#include <boost/iterator/transform_iterator.hpp> 
#include <boost/spirit/home/phoenix.hpp> 
#include <numeric> 
#include <iostream> 

using namespace boost::phoenix; 
using namespace boost::phoenix::arg_names; 

int main(void){ 
    int i[] = {4,2,5,3}; 

    std::cout << 
     std::accumulate(
     boost::make_transform_iterator(i, _1*_1), 
     boost::make_transform_iterator(i+4, _1*_1), 
     0 
    ) << std::endl; 

    return 0; 
} 

इस संकलन से त्रुटि संदेश के प्रासंगिक भाग है (जीसीसी 4.3.4, को बढ़ावा देने के 1.43):

/usr/include/boost/iterator/transform_iterator.hpp:43: error: no type named ‘result_type’ in ‘struct boost::phoenix::actor<... 

मुझे बूस्ट :: लैम्बडा (result_type गुम) के साथ एक ही समस्या है। मैंने सोचा कि मैंने अतीत में make_transform_iterator और lambda के लिए समान उपयोग देखा था, अब मैं सोच रहा हूं कि मैंने अभी कल्पना की है या नहीं।

क्या result_type का पर्दाफाश करने के लिए फीनिक्स या लैम्ब्डा में एक प्रदान किया गया रैपर या कुछ अन्य तंत्र है?

उत्तर

4

ऐसा लगता है कि यह boost trunk में तय किया गया है (अप्रत्यक्ष UnaryFunc::result_type के बजाय लाइन 51, result_of<> देखें)। तो यह 1.44 और ऊपर में कोई मुद्दा नहीं होना चाहिए।

यहां < 1.44 को बढ़ावा देने के लिए एक कामकाज है। Reference टेम्पलेट पैरामीटर प्रदान नहीं किया गया है, तो ट्रांसफॉर्म_इटरेटर तत्काल UnaryFunc::result_type का उपयोग करता है। तो एक चाल है make_transform_iterator को उस संस्करण के साथ प्रतिस्थापित करना है जो परिणाम_of <> यूनरीफनक पर मेटा फ़ंक्शन को संदर्भित करता है और संदर्भ टेम्पलेट पैरामीटर के परिणाम का उपयोग करता है।

#include <boost/iterator/transform_iterator.hpp> 
#include <boost/utility.hpp> 
#include <iterator> 

template <class UnaryFunc, class Iterator> 
boost::transform_iterator< 
    UnaryFunc, 
    Iterator, 
    typename boost::result_of< 
     UnaryFunc(typename std::iterator_traits<Iterator>::value_type) 
    >::type 
> 
make_trans_it(Iterator it, UnaryFunc fun){ 
    return 
     boost::transform_iterator< 
     UnaryFunc, 
     Iterator, 
     typename boost::result_of< 
      UnaryFunc(typename std::iterator_traits<Iterator>::value_type) 
     >::type 
     >(it, fun); 
}; 
संबंधित मुद्दे

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