2011-07-04 5 views
0

시간을 절약하고 코드를 읽을 수있게하려고합니다. BOOL을 리턴하는 'isXXX'메시지가 많이 있습니다. 나는 끊임없이 더 많은 'is'메시지를 추가하고있다. 미리 컴파일 할 때 매크로를 확장하여 목록을 통해 만들 수 있습니까?확장 가능한 매크로 미리 컴파일

지정할 내용 : isMacro (1, 2, 3). (BOOL) IS1 {...} - -이 될 것 같은 ... (BOOL) IS2

것 같다

그리고 그 각각에 대해

, 나는 전체로 확장하는 매크로 원하는 프리 컴파일러 매크로 확장을 잘 사용하지만 isMacro (...) 부분을 구현하는 방법을 잘 모르겠습니다. (구체적으로, 컴파일 전에 완전한 기능으로 확장되는 ...).

--- 업데이트 :

방법은 모두 동적으로 계산되지만, 모든 일반적인 '이다'.

저는 열거 형 값에 대해 단일 변수를 테스트하고 동 일한지 여부를 결정합니다. 동적이기 때문에 @synthesize 할 수 없습니다. 나는 편의상 @property에 모든 것을 가지고있다. 저는 단지 @synthesize와 같은 것을 원합니다. 모든 것을 나열하고 각 isXXX 메소드에 대한 동적 응답을 생성 할 수 있습니다.

또한 올바른 열거 형 값인지 확인하기 위해 사전 컴파일 검사가 없기 때문에 isCheck : (opMode) 모드를 실행하고 싶지 않습니다.

모든 함수는 다음 형식으로되어 있습니다.
-(BOOL) isTurtle { return operationMode == Turtle; } 핵심은 간단하게 속성으로 사용하기를 원합니다. 따라서, 나는 다음과 같은 것을 원하지 않는다 : (opMode) 모드, 어디서 지정해야 하는가 BOOL res = [obj is:Tutle];

+0

이것은 C++, Objective-C 또는 C의 경우입니까? 여기에 세 가지 언어를 모두 태그했습니다. – templatetypedef

+0

실제로 무엇을하고 싶습니까? '- (BOOL) is1 {...}, - (BOOL) is2 ...'는 유효한 C 코드가 아닙니다. 왜 그렇게 평가되는 매크로를 원합니까? –

+2

@David : 사실, 당신은 Objective-C에 있습니다. 언어로 작업하는 경우 해당 언어에 태그를 지정하십시오. 태그가 적용될 수 있다고 생각하기 때문에 다른 언어에는 태그를 지정하지 마십시오. – Puppy

답변

2

Boost.Preprocessor을 사용할 수 있다면 BOOST_PP_REPEAT_FROM_TO 매크로가 필요하다.

#include <boost/preprocessor/repetition/repeat_from_to.hpp> 

#define IS_METHODS(depth, n, aux) -(BOOL)is ## n { return aux == n; } 

@implementation Foo 
BOOST_PP_REPEAT_FROM_TO(1, 31, IS_METHODS, operationMode) 
@end 

당신이 할 수 없다면, 당신은 운이 없어. BOOST_PP_REPEAT_FROM_TO를 구현하는 것은 30+ 함수를 직접 작성하는 것과 거의 같은 노력입니다.

또한 [obj isMode:12]이 (가) obj.is12보다 실제로 얼마나 나쁜지는 알 수 없습니다. 전자는 가변 모드를 허용하며 다른 프로그래머에게는 덜 민감합니다 (유지 관리 노력에 대해 생각하십시오).

+1

@David : 30 가지 이상의 'isN'함수가하는 것을 보여줘야합니다. – kennytm

+0

@ David : Boost를 사용할 수 있습니까? ([Boost.Preprocessor] (http://www.boost.org/doc/libs/1_46_1/libs/preprocessor/doc/index.html) 정확한 참조.) – kennytm

+0

수 없습니다. 하지만 네가 자리하고있어. Boost의 "로컬 반복"기능을 찾고 있습니다. – David