2009-06-19 5 views

उत्तर

15

आप एक संदेश कार्यान्वयन (IMP) है, जो दो छिपा पैरामीटर, self और प्रकार id की _cmd और SEL क्रमशः के साथ सिर्फ सादा सी कार्य हैं करने के लिए बाध्य करने के लिए सक्षम होना चाहिए।

संपादित करें: बस निम्नलिखित पूर्ण उदाहरण का परीक्षण किया गया है, और ऐसा लगता है कि यह काम करता है।

#include <stdio.h> 
#include <boost/bind.hpp> 
#include <Foundation/NSObject.h> 

@interface MyClass : NSObject 
{ 
} 
-(int) doSomething:(int)arg; 
@end 

@implementation MyClass 
-(int) doSomething:(int)arg 
{ 
    printf("doSomething: self=0x%08x _cmd=0x%08x\n", self, _cmd); 
    return arg + 1; 
} 
@end 

int main(void) 
{ 
    MyClass *myObj = [[MyClass alloc] init], *otherObj = [[MyClass alloc] init]; 
    typedef int (*MyFunc)(id, SEL, int); 
    SEL doSomething_sel = @selector(doSomething:); 
    MyFunc doSomething_impl = (MyFunc)[myObj methodForSelector:doSomething_sel]; 

    // bind self & _cmd arguments: 
    // calls [myObj doSomething:x] 
    int result = boost::bind(doSomething_impl, myObj, doSomething_sel, _1)(14); 
    printf("result1: %d\n", result); 

    // bind _cmd & arg: 
    // calls [otherObj doSomething:3] 
    result = boost::bind(doSomething_impl, _1, doSomething_sel, 42)(otherObj); 
    printf("result2: %d\n", result); 

    return 0; 
} 
GNUstep साथ

, के रूप में संकलन:

gcc objcbind.mm -o objcbind -I/usr/include/GNUstep -lobjc -lstdc++ -lgnustep-base 

Mac OS X पर, के रूप में संकलन:

gcc objcbind.mm -o objcbind -framework Foundation -lstdc++ 

आउटपुट:

 
doSomething: self=0x01a85f70 _cmd=0x00602220 
result1: 15 
doSomething: self=0x01a83d70 _cmd=0x00602220 
result2: 43 
+0

उचित लग रहा है! –

+1

यदि कोई और देख रहा है तो मैं बूस्ट :: बाध्य के स्थान पर std :: bind के साथ उपरोक्त प्राप्त कर सकता हूं यदि आप नहीं चाहते हैं कि बूस्ट फ्रेमवर्क का उपयोग करने की आवश्यकता हो। उपरोक्त उदाहरण के लिए धन्यवाद एडम! –

+0

हाँ, जब संभव हो तो बढ़ावा देने से बचें। मैं उस समय इसका उपयोग कर अटक गया था। –

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