You will need a preprocessor to create a large one switch. You will need get<>to search for no-op outside the list. Check the compiler output to make sure that unused cases do not produce a result if you like it; adjust if necessary, v).
Take a look at the Preprocessor Boost library if you are interested in this ...
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)
}
};