2013-01-03 1 views
3

일부 Objective C "코드 블록"메서드를 C++에서 이에 상응하는 것으로 변환하는 데 도움이 필요합니다. 알려주십시오.Objective C "코드 블록"을 C++에서 동등한 것으로 변환

... A는 코드 블록으로 .h 파일에 정의

.. 하나 개 .mm 파일에 사용

typedef void (^A)(void*); //argument is ptr to B 

을 .. 사용되고

[[hello getInstance] getB]->queueLoadImageWithBlock([self.str UTF8String], (A 

)^(무효 * img) { // 일부 코드 ...

  }); 
+0

C++ 세계는 어떤 종류의 인터페이스를 제공합니까? C++에는 "canned function"이라는 개념을 구현하는 세 가지 구문이 있습니다. 포인터, 멤버, 펑터 및 C 스타일 함수 포인터가 있습니다. 어떤 Cocos2dx API가 기대하는 것입니까? –

+0

그것은 C++ 스타일 함수 포인터이거나 위의 코드 스 니펫에 가까운 것이어야합니다. – user1908860

+0

'queueLoadImageWithBlock()'이 시스템에서 제공되고 있습니까? 그렇다면 두 번째 매개 변수의 유형은 무엇입니까? 블록이라면 함수 포인터로 만족시킬 방법이 없습니다. 그들은 단지 동등하지 않습니다. –

답변

0

블록에 대한 요구 사항은 시스템에 대한 요구 사항과 동일합니다.

내가 말했듯이, 몇 가지 접근법이 있습니다. 함수 포인터는 최소한의 상용구가 필요하지만 호출자의 컨텍스트를 전달하려면 추가 인수가 필요합니다 (self 내용). 펑터 및 멤버와의 포인터는 일반적으로 템플릿 기계가 작동하도록 요구합니다.

//Let's define a callback datatype 
typedef void (*ResourceLoadObjFuncPtr)(void *, void*); 
//argument 1 is ptr to ResourceLoadDescriptor, argument 2 is iconSlot, whatever it is 

//Function that implements that type: 
void MyLoad(void *img, void *iconSlot) 
{ 
    UIImage* img2 = (UIImage*)img; 
    UIImageView* iv = [[UIImageView alloc] initWithImage:img2]; 
    iv.backgroundColor = [UIColor clearColor]; 
    [(TheTypeOfIconslot*)iconSlot addSubview:iv]; 
    iconLoaded(iv); 
    [iv release]; 
} 

을 그리고 대신 ResourceLoadObjCBlockCBResourceLoadObjFuncPtr 매개 변수를 받아 queueLoadImageWithBlock의 프로토 타입을 수정해야 할 것, 단지 iconSlot의 컨텍스트 (또 다른 매개 변수 : 함수 포인터 그래서, 여기 갈 것입니다 방법 우리의 경우).

그리고 호출 :

[[GameViewController getInstance] getResourceLoadMediator]-> 
    queueLoadImageWithFunction([self.url UTF8String], MyLoad, self.iconSlot); 

블록은 폐쇄가

- 그들이 선언하고 함수의 변수를 캡처합니다. C++은 iOS에서 GCC가 지원하는 폐쇄를 제공하지 않습니다 (블록 제외). 따라서 변수를 함수 범위에서 함수 매개 변수로 직접 전달해야합니다. 우리의 경우, 제 가정이 옳다면, 단지 하나의 변수 만 있습니다; 보다 복잡한 경우에는 구조체에 랩핑하고 포인터를 포인터에 전달해야합니다.

대체 방법으로는 추상 기본 클래스와 해당 생성자를 통해 컨텍스트를 캡처하는 구체적인 구현을 사용하는 것입니다. 이 같이 갈 것 :

//Callback type 
class ResourceLoader 
{ 
public: 
    virtual void Load(void *) = 0; 
}; 

//A callback implementation - not a function, but a class 

class MyResourceLoader : public ResourceLoader 
{ 
    IconSlotType *iconSlot; 

    void Load(void *img) 
    { 
     //Same loader stuff as above 
    } 
public: 
    MyResourceLoader(IconSlotType *isl) 
    :iconSlot(isl) 
    {} 
}; 

queueLoadImageWithBlock 해당하는 지금 형 ResourceLoader*의 두 번째 매개 변수없이 세 번째 매개 변수를 취할 것입니다. 호출에 관해서는 콜백 객체 수명 문제가 있습니다. queueLoadImageWithBlock 비동기식입니까? 즉, 콜백 호출 전에 반환됩니까? 그렇다면 MyResourceLoader의 로컬 인스턴스는 수행하지 않으며 동적으로 인스턴스를 만들어야합니다. 이 동기의 가정 (..이 반환 한 후 즉하면 콜백을 호출하지 않음) :

MyResourceLoader ResLoader(self.iconSlot); 
[[GameViewController getInstance] getResourceLoadMediator]-> 
    queueLoadImageWithLoader([self.url UTF8String], &ResLoader); 

를 그렇지 않은 경우

[[GameViewController getInstance] getResourceLoadMediator]-> 
    queueLoadImageWithLoader([self.url UTF8String], new MyResourceLoader(self.iconSlot)); 
+2

-1 : Functor보다 함수 포인터를 추천 할 이유가 없습니다. 템플릿을 작성하는 아이디어가 무서워지면,이 작업을 즉시 수행 할 수있는'std :: function' 또는'boost :: function'을 시도해보십시오. 아니면, 람다. – Puppy

+0

별로 좋지 않습니다. gcc는 C++ 11 람다를 지원하지 않지만 clang (어느 쪽이라도 사용해야 함)은 많은 C++ 11 기능을 지원하며 람다 함수도 그 중 하나입니다. – Ahti

+0

당신은 무엇을 피우고 있습니까? GCC에는 람다가 있습니다. 지옥, 심지어 * Visual Studio *에는 람다가 있습니다. – Puppy

2

가장 직접적인 비유 std::function입니다. 이것은 시그니처가 주어진 값 유형입니다 (예 : std::function<int(int)>). 해당 서명의 함수 객체가 될 수 있습니다. 호출 사이트에서 블록 대신 람다를 사용할 수 있습니다.

obj->queueLoadImageWithBlock(self.url, [](void* img) 
{ 
    UIImage* img2 = (UIImage*)img; 
    UIImageView* iv = [[UIImageView alloc] initWithImage:img2]; 
    iv.backgroundColor = [UIColor clearColor]; 
    [self.iconSlot addSubview:iv]; 
    iconLoaded(iv); 
    [iv release]; 
}); 
+0

"네임 스페이스 std"에서 "no type named"function이라고 말합니다. 헤더 파일을 포함해야합니까? – user1908860

+0

이 코드가 작동하는 Xcode 버전으로 해당 대답을 인증해야합니다. –

+0

''입니다. – Puppy

1

Apple 버전의 clang을 사용하면 C 및 C++ 및 Objective-C 블록을 사용할 수 있습니다. 이것은 비표준 C++이지만, 분명히 작동합니다.

lambda는 블록에 할당 할 수 있기 때문에 호출 된 함수를 변경하지 않고 C++ 람다를 사용할 수 있습니다 (다른 방법은 사용할 수 없음). 자세한 내용은 this question을 참조하십시오.

관련 문제