考虑这段代码
template<typename T>
void call_me(const T& arg) {
}
template<int i>
struct custom_type {
};
void foo(int i)
{
switch (i) {
case 0:
call_me( custom_type<0>() );
break;
case 1:
call_me( custom_type<1>() );
break;
case 2:
call_me( custom_type<2>() );
break;
default:
break;
}
}
switch语句在其意图的意义上是不完整的,即不仅适用于上面明确提到的少数几个整数。 C ++不允许使用custom_type<i>
之类的语句,因为i
不是常量表达式。 (..并且我无法将函数foo
的参数更改为常量表达式)。此外,我不想使用外部代码生成器生成一个巨大的switch语句并将其反馈回源代码..
在C ++ / 11/14/17中是否有任何方法可以以优雅的方式将函数调用写入call_me
,或者只是答案,'不,C ++是静态类型的。'?
答案 0 :(得分:5)
这样的事情应该有效,加上特殊情况call_me_t&lt; 0&gt;
template <int N>
struct call_me_t
{
static void exec(int i)
{
if (i < N)
call_me_t<N-1>::exec(i) ;
else if (i == N)
call_me(custom_type<N>()) ;
}
} ;
template<>
struct call_me_t<0>
{
static void exec(int i)
{
call_me(custom_type<0>()) ;
}
};
void foo(int i)
{
call_me_t<10>::exec(i) ; // 10 is maximum value in switch
}
答案 1 :(得分:1)
您可以使用以下内容:
template <std::size_t I>
void call_me_with_custom_type()
{
call_me(custom_type<I>());
}
namespace detail
{
template <std::size_t ... Is>
void foo(std::index_sequence<Is...>, int i)
{
std::function<void()> calls[] = {call_me_with_custom_type<Is>...};
calls[i]();
}
}
template <std::size_t N>
void foo(int i)
{
detail::foo(std::make_index_sequence<N>{}, i);
}