Для каждого значения из некоторого енума определена шаблонная функция, параметризованная этим значением.
template<int N> int func(const SomeType& st);
template<> int func<SomeEnum::Foo>(const SomeType& st) { /* ... */ }
template<> int func<SomeEnum::Bar>(const SomeType& st) { /* ... */ }
/* и так далее ~20 функций */
в клиентском коде нужно сопоставить переменной, принимающей значения из SomeEnum, функцию func с тем же значением.
typedef int(*SomeFunction)(const SomeType&);
/* клиентский код, зовется при инициализации */
SomeEnum se = getEnumVal();
SomeFunction sf;
switch(se)
{
case SomeEnum::Foo:
sf = func<SomeEnum::Foo>;
break;
case SomeEnum::Bar:
sf = func<SomeEnum::Bar>;
break;
/* и так далее ~20 кейсов */
}
Возникает вопрос, нельзя ли этот длинный свич заменить на что-нибудь более короткое (даже, если менее приличное)? Кажется, что boost.preprocessor должен делать что-то похожее. Но мои познания в данной области не слишком. Поможите.