मुझे यह नहीं पता कि यह संभव है, लेकिन यदि यह है, तो सिंटैक्स कैसा दिखता है?क्या मैं एक उद्देश्य सी फ़ंक्शन में :: बाइंड() को बढ़ा सकता हूं?
यदि संभव नहीं है, तो क्यों नहीं?
मुझे यह नहीं पता कि यह संभव है, लेकिन यदि यह है, तो सिंटैक्स कैसा दिखता है?क्या मैं एक उद्देश्य सी फ़ंक्शन में :: बाइंड() को बढ़ा सकता हूं?
यदि संभव नहीं है, तो क्यों नहीं?
आप एक संदेश कार्यान्वयन (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
उचित लग रहा है! –
यदि कोई और देख रहा है तो मैं बूस्ट :: बाध्य के स्थान पर std :: bind के साथ उपरोक्त प्राप्त कर सकता हूं यदि आप नहीं चाहते हैं कि बूस्ट फ्रेमवर्क का उपयोग करने की आवश्यकता हो। उपरोक्त उदाहरण के लिए धन्यवाद एडम! –
हाँ, जब संभव हो तो बढ़ावा देने से बचें। मैं उस समय इसका उपयोग कर अटक गया था। –