7

मैंने function टेम्पलेट के स्पष्टीकरण का पालन करने का प्रयास किया।सी ++ 0x फ़ंक्शन <>, बाध्य और सदस्य

struct IntDiv { // functor 
    float operator()(int x, int y) const 
    { return ((float)x)/y; } 
}; 

// function pointer 
float cfunc(int x, int y) { return (float)x+y; } 

struct X { // member function 
    float mem(int x, int y) const { return ...; } 
}; 
using namespace placeholders; // _1, _2, ... 

मैं करने के लिए प्रदान करना चाहते हैं: मैं विशेष रूप से सी समारोह-संकेत, functors, lambdas और सदस्य-समारोह-संकेत

की interchangability defintions को देखते हुए के साथ खेला function<float(int,int)> सब कुछ संभव:

int main() { 
    // declare function object 
    function<float (int x, int y)> f; 
    //== functor == 
    f = IntDiv{}; // OK 
    //== lambda == 
    f = [](int x,int y)->float { return ((float)y)/x; }; // OK 
    //== funcp == 
    f = &cfunc; // OK 

    // derived from bjarnes faq: 
    function<float(X*,int,int)> g; // extra argument 'this' 
    g = &X::mem; // set to memer function  
    X x{}; // member function calls need a 'this' 
    cout << g(&x, 7,8); // x->mem(7,8), OK. 

    //== member function == 
    f = bind(g, &x,_2,_3); // ERROR 
} 

और अंतिम पंक्ति एक सामान्य अपठनीय संकलक-टेम्पलेट-त्रुटि देता है। श्वास

मैं f को मौजूदा x उदाहरण सदस्य फ़ंक्शन में बांधना चाहता हूं, ताकि केवल float(int,int) हस्ताक्षर शेष हो।

क्या

f = bind(g, &x,_2,_3); 

के बजाय लाइन होना चाहिए ... या और कहाँ त्रुटि है?


पृष्ठभूमि:

यहाँ bind और function का उपयोग कर एक सदस्य समारोह के साथ के लिए Bjarnes उदाहरण आता है:

struct X { 
    int foo(int); 
}; 
function<int (X*, int)> f; 
f = &X::foo;  // pointer to member 
X x; 
int v = f(&x, 5); // call X::foo() for x with 5 
function<int (int)> ff = std::bind(f,&x,_1) 

मैं सोचाbind इस तरह से प्रयोग किया जाता है: संयुक्त राष्ट्र से सौंपा स्थानों placeholders प्राप्त करें, शेष bind में भरा हुआ है। _1 अखरोट this, तो` चाहिए? और इसलिए अंतिम पंक्ति हो:

function<int (int)> ff = std::bind(f,&x,_2) 

Howards सुझाव पर नीचे मैं इसे :-) order of args in bind

+0

क्यों न केवल लैम्ब्डा का उपयोग करें? – Puppy

+0

अच्छा! :-) ....... –

उत्तर

8
f = bind(g, &x,_1,_2); // OK 

प्लेसहोल्डर लौटे बाँध वस्तु में तर्क पदों का उल्लेख करने की कोशिश की। सूचकांक g के पैरामीटर नहीं है।

+0

ओह, आश्चर्यजनक मुझे अब तक याद आया। मुझे लगता है कि मुझे इसके लिए चित्र बनाने की जरूरत है, क्योंकि जब मुझे इसे स्वयं समझाना होगा। – towi

+0

यदि आप समझते हैं कि उस ड्राइंग को यहां कैसे प्रकाशित करना है, तो यह बहुत अच्छा होगा! मुझे यकीन है कि यह बहुत से लोगों की मदद करेगा! :-) –

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