Вам понадобится препроцессор для генерации большого switch
. Вам понадобится get<>
, чтобы запретить поиск вне пределов. Проверьте выходные данные компилятора, чтобы убедиться, что неиспользуемые случаи не дают результатов, если вам это нужно; при необходимости отрегулируйте; v).
Обратитесь к библиотеке препроцессора Boost, если вы хотите преуспеть в подобных вещах ...
template <typename L>
struct type_switch
{
template< typename F >
void operator()( size_t i, F& f )
{
switch ( i ) {
#define CASE_N( N ) \
case (N): return f.operator()<typename impl::get<L,N>::type>();
CASE_N(0)
CASE_N(1)
CASE_N(2)
CASE_N(3) // ad nauseam.
}
};