解决C ++

时间:2015-05-29 13:34:07

标签: c++

考虑这段代码

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 ++是静态类型的。'?

2 个答案:

答案 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);
}