2013-01-19 9 views
7

जबकि सी ++ 11 नई सुविधाओं के साथ प्रयोग, मुझे पता चला कि std :: प्लेसहोल्डर :: _ 1 नहीं सीधे lambdas रूप में इस्तेमाल किया जा सकता है:C++ 11 प्लेसहोल्डर्स का प्रयोग lambdas के रूप में करते हुए?

#include <algorithm> 
#include <functional> 
// #include <boost/lambda/lambda.hpp> 

using namespace std; 
// using boost::lambda::_1; 
using std::placeholders::_1; 

int main() 
{ 
    int a[] = {1,2,3,4,5}; 

    transform(a, a+5, a, _1 * 2); 
} 

बजना 3.3 त्रुटि:

tmp $ clang -std=c++11 -stdlib=libc++ -lc++ test.cpp 
test.cpp:16:27: error: invalid operands to binary expression ('__ph<1>' and 'int') 
    transform(a, a+5, a, _1 * 2); 

यदि मैं बूस्ट के संस्करण का उपयोग करने के लिए इसे बदलता हूं तो यह ठीक से संकलित करता है।

यह मानक संस्करण के साथ क्यों काम नहीं करता है? क्या इसे काम करने का कोई तरीका है या क्या मुझे यहां एक बदसूरत लैम्ब्डा का उपयोग करना चाहिए?

transform(a, a+5, a, [](int i){return i*2;}); 

उत्तर

7

बूस्ट वास्तव में _1 प्लेसहोल्डर हैं। Boost.Bind (जो C++ 11 में कम या कम शामिल थे), Boost.Lambda के लोग, और यहां तक ​​कि Lambda के उत्तराधिकारी Boost.Phoenix से भी।

लैम्ब्डा और फीनिक्स संस्करण केवल प्लेसहोल्डर्स हैं जिनका उपयोग स्वयं द्वारा मकान बनाने के लिए किया जा सकता है। Boost.Bind _1 प्लेसहोल्डर्स नहीं कर सकते हैं, और यही मानकीकृत किया गया था। लैम्ब्डा और फीनिक्स एक अभिव्यक्ति को एक समारोह में बदलने के तरीके हैं; बांध बस एक समारोह बाध्यकारी और तर्क समायोजन प्रणाली है।

+0

मैं देखता हूं। बूस्ट के बराबर लागू करने के लिए कठिन/बुरा होगा: नई लैम्ब्डा प्रणाली के साथ लैम्ब्डा/फीनिक्स? – ogoid

+0

@ogoid: उम, * क्या * नया लैम्ब्डा सिस्टम? इसके अलावा, आप एक पूरी तरह से अलग सवाल पूछ रहे हैं। –

+0

@ogoid: मेरे लिए बूस्ट का पुन: आविष्कार करना मुश्किल होगा। लैम्ब्डा, हालांकि मुझे आपके बारे में पता नहीं है। – Mehrdad

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