2009-06-19 17 views

cevap

15

İki gizli parametreler sırasıyla self ve türleri id ait _cmd ve SEL ile sadece düz C fonksiyonları bir mesaj uygulaması (IMP), bağlamak gerekir.

EDIT: Yalnızca aşağıdaki tam örneği test ettik ve işe yarayacak gibi görünüyor.

GNUstep'den ile
#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; 
} 

olarak derlemek:

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

Mac OS X'te olarak derlemek:

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

Çıktı

:

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

makul görünüyor! –

+1

Başka biri benim gibi görünüyorsa, destek çerçevesini kullanmak istemezseniz/kullanmanız gerekmiyorsa, yukarıdaki gibi std :: bind'i boost :: ile bağlayabilirsiniz. Yukarıdaki örnek için teşekkürler Adam! –

+0

Evet, en iyi ihtimalle mümkün olan en yüksek seviyeyi korumak. O zaman bunu kullanarak sıkışmıştım. –

İlgili konular