Итак, у меня есть это огромное дерево, которое в основном представляет собой большой переключатель/случай со строковыми клавишами и различными вызовами функций на одном общем объекте в зависимости от ключа и одного фрагмента метаданных.
Каждая запись выглядит так:
} else if ( strcmp(key, "key_string") == 0) {
((class_name*)object)->do_something();
} else if ( ...
где do_something
может иметь разные вызовы, поэтому я не могу просто использовать указатели на функции. Кроме того, некоторые ключи требуют, чтобы объект был добавлен в подкласс.
Теперь, если бы я должен был кодировать это на языке более высокого уровня, я бы использовал словарь lambdas, чтобы упростить это.
Мне пришло в голову, что я могу использовать макросы, чтобы упростить это для чего-то вроде
case_call("key_string", class_name, do_something());
case_call( /* ... */ )
где case_call
будет макросом, который расширяет этот код до первого фрагмента кода.
Однако, я очень нахожусь на заборе, будет ли это считаться хорошим стилем. Я имею в виду, что это уменьшит работу набрав и улучшит СУЩНОСТЬ кода, но тогда, похоже, это несколько портит макросистему.
Не могли бы вы пойти по этой дороге или, скорее, напечатать все это? И что бы вы сделали для этого?
Edit
Некоторые пояснения:
Этот код используется как слой клея между упрощенным скриптовым API, который обращается к нескольким различным аспектам С++ API как к простым свойствам ключа. Свойства реализованы по-разному в С++: у некоторых есть методы getter/setter, некоторые из них заданы в специальной структуре. Скриптовые действия ссылаются на объекты С++, переданные в общий базовый класс. Однако некоторые действия доступны только для определенных подклассов и должны быть отброшены.
Далее по дороге я могу изменить фактический С++ API, но на данный момент его нужно считать неизменным. Кроме того, это должно работать на встроенный компилятор, поэтому boost или С++ 11 (к сожалению) недоступны.