Предварительно скомпилировать расширяемый макрос - PullRequest
0 голосов
/ 04 июля 2011

Я пытаюсь сэкономить время / сделать мой код читабельным.У меня много сообщений «isXXX», которые возвращают BOOL.Я постоянно добавляю больше сообщений «есть».Можно ли сделать макрос, который можно расширять во время предварительной компиляции через список.

Я хочу указать: isMacro (1, 2, 3).

И для каждого из них,Я хочу, чтобы макрос расширил его до полного - (BOOL) is1 {...}, - (BOOL) is2 ...

Кажется, что это было бы хорошим использованием расширения макроса прекомпилятора,но я не уверен, как реализовать часть isMacro (...).(В частности, ..., который расширяется до полных функций перед компиляцией).

--- Обновление:

Все методы "is" вычисляются динамически, но все они являются общими.

Я проверяю одну переменную по отношению к значению enum и определяю, равно ли оно.Я не могу @ синтезировать их, потому что это динамично.У меня есть все из них в @property для удобства.Я просто хочу что-то вроде @synthesize, где я могу перечислить их все и создать динамический ответ для каждого метода isXXX.

Кроме того, я не хочу запускать режим isCheck: (opMode), так какнет никакой предварительной проверки компиляции, чтобы убедиться, что это допустимое значение перечисления.

Все функции is имеют следующий формат:
-(BOOL) isTurtle { return operationMode == Turtle; } Ключ в том, что я хочу, чтобы он функционировал каксвойство для простоты.Поэтому я не хочу что-то вроде режима: (opMode), где я должен указать BOOL res = [obj is:Tutle];

1 Ответ

2 голосов
/ 04 июля 2011

Если вы можете использовать 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. Первый также допускает переменный режим и менее загадочен для других программистов (подумайте об усилиях по обслуживанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...