2011-07-04 172 views
0

我試圖節省一些時間/使我的代碼可讀。我有很多返回BOOL的'isXXX'消息。我不斷地添加更多「正在」消息。是否有可能通過列表在預編譯時創建一個可擴展的宏。預編譯可擴展宏

我想指定: isMacro(1,2,3)。

和每個那些,我想宏將其擴展成一個完整的 - (BOOL)IS1 {...} - (BOOL)IS2 ...

看起來這將是一個很好地使用預編譯器宏擴展,但我不確定如何實現isMacro(...)部分。 (具體來說,......在編譯之前擴展爲全部函數)。

---更新:

的「是」方法都是動態計算,但他們都是常見的。

我測試一個變量對枚舉值並確定它是否相等。我不能將它們合成,因爲它是動態的。爲了方便起見,我將它們全部放在@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+個''N''函數的功能。 – kennytm

+0

@David:你允許使用Boost嗎? ([Boost.Preprocessor](http://www.boost.org/doc/libs/1_46_1/libs/preprocessor/doc/index.html)。) – kennytm

+0

不能。但是你很清楚。我正在尋找Boost的「本地迭代」功能。 – David