Метапрограммирование C/C++ с использованием препроцессора

Итак, у меня есть это огромное дерево, которое в основном представляет собой большой переключатель/кейс со строковыми ключами и различными вызовами функций для одного общего объекта в зависимости от ключа и одной части метаданных.

Каждая запись в основном выглядит так

} else if ( strcmp(key, "key_string") == 0) {
    ((class_name*)object)->do_something();
} else if ( ...

, где do_somethingмогут иметь разные вызовы, поэтому я не могу просто использовать указатели на функции. Кроме того, некоторые ключи требуют приведения объекта к подклассу.

Теперь, если бы мне нужно было закодировать это на языке более высокого уровня, я бы использовал словарь лямбда-выражений, чтобы упростить это.

Мне пришло в голову, что я могу использовать макросы, чтобы упростить это до чего-то вроде

case_call("key_string", class_name, do_something());
case_call( /* ... */ )

, где case_callбудет макросом, который расширит этот код до первого фрагмента кода.

Тем не менее, я очень сомневаюсь, будет ли это считаться хорошим стилем. Я имею в виду, что это уменьшило бы работу по набору текста и улучшило бы DRYness кода, но тогда это действительно несколько злоупотребляет системой макросов.

Не могли бы вы пойти по этому пути или, скорее, напечатать все это целиком? И каковы были бы ваши доводы для этого?

Изменить

Некоторое пояснение:

Этот код используется в качестве связующего слоя между упрощенным API сценариев, который обращается к нескольким различным аспектам API C++ в виде простых свойств ключ-значение.Однако в C++ свойства реализованы по-разному: у некоторых есть методы получения/установки, некоторые задаются в специальной структуре. Действия сценариев ссылаются на объекты C++, приведенные к общему базовому классу. Однако некоторые действия доступны только для определенных подклассов и должны быть отменены.

В дальнейшем я могу изменить фактический C++ API, но на данный момент его следует считать неизменным. Кроме того, это должно работать на встроенном компиляторе, поэтому boost или C++ 11 (к сожалению) недоступны.

13
задан bastibe 17 May 2012 в 19:16
поделиться