2014-05-08 4 views
-3

컴파일 타임에 선언 된 블록의 반환 유형을 결정할 수 있습니까? 컴파일러는 블록 내의 return 문을 기반으로 유형을 유추하여이를 수행합니다. 이 결과를 프로그래머가 사용할 수 있습니까? 예를 들어ObjectiveC - 컴파일 타임에 블록 반환 유형 결정

:

^{ 
    return [NSArray array]; 
} 

는 내가 달성하기 위해 노력하고있어 __typeof__에 매크로와 유사하다

^NSArray*(){ 
    return [NSArray array]; 
} 

에 컴파일러에 의해 번역,하지만 블록 반환 형식을 반환합니다. 예를 들어 DECLARE_BLOCK(myBlock, ^{return [NSArray array];})과 같은 매크로는 NSArray* (^myBlock)() = ^{...}으로 확장됩니다.

이 매크로를 사용하면 C++11auto 구조와 비슷한 비슷한 유연한 블록을 선언 할 수 있습니다.

+6

세계에서 왜 이런 행동이 필요한지 궁금한 점이 있습니까? 어떤 문제를 해결하려고하는지 자세히 설명해 주시겠습니까? –

+0

저는 여기서 컴파일러가 "블록 내의 return 문을 기반으로 유형을 추론합니다."라는 의미를 궁금해합니다. 컴파일러는 예상되는 유형을 알고 (제거하려고하는 선언에 따라) 유형이 일치하는지 확인합니다. 이것은 유형 유추와 다릅니다. –

+0

이것은 의미가 없습니다. 만약 당신이'^ id {return @ [];}'를 가지고 있다면? 그것은'NSArray *'를 반환하지만 반환 값의 타입은'id'입니다. 컴파일러가 당신의 예제가'id'도 리턴한다고 생각하는지 확실히 확신해라. – Kevin

답변

0

리턴 유형을 얻는 방법은 간단합니다. __typeof__(^{...}()) - 블록 호출을 시뮬레이트합니다.

해결책이 내 것이 아니기 때문에 키위프 프레임 워크 (https://github.com/kiwi-bdd/Kiwi/pull/528/files)에 제출 된 요청에 발견했습니다.

관련 문제