switch + template; задача для boost.preprocessor?
От: pasenger  
Дата: 14.10.07 09:26
Оценка:
Для каждого значения из некоторого енума определена шаблонная функция, параметризованная этим значением.
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 должен делать что-то похожее. Но мои познания в данной области не слишком. Поможите.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.