Итак, у меня есть это огромное дерево, которое в основном представляет собой большой переключатель/кейс со строковыми ключами и различными вызовами функций для одного общего объекта в зависимости от ключа и одной части метаданных.
Каждая запись в основном выглядит так
} 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 (к сожалению) недоступны.