运行时类型切换类型列表作为开关而不是嵌套if?

时间:2010-01-28 19:05:18

标签: c++ switch-statement typelist

这是来自TTL:

////////////////////////////////////////////////////////////
//  run-time type switch
template <typename L, int N = 0, bool Stop=(N==length<L>::value) > struct type_switch;

template <typename L, int N, bool Stop>
  struct type_switch
  {
    template< typename F >
      void operator()( size_t i, F& f )
      {
        if( i == N )
        {
          f.operator()<typename impl::get<L,N>::type>();
        }
        else
        {
          type_switch<L, N+1> next;
          next(i, f);
        }
      }
  };

它用于TypeList上的类型切换。问题是 - 他们通过一系列嵌套if来做到这一点。有没有办法将此类型切换作为单个select语句?

谢谢!

3 个答案:

答案 0 :(得分:2)

您需要预处理器来生成大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.
      }
  };

答案 1 :(得分:0)

我不这么认为。

这种模板元编程通常用递归完成。由于这一切都发生在编译时,如果没有运行时递归或条件检查,我不会感到惊讶。

答案 2 :(得分:0)

您始终可以使用二分搜索而不是线性搜索。它会更复杂,更容易出现错误(二进制搜索很容易搞砸)。

您也可以手动展开N type_switch::operator(),其中N是您在程序中的类型列表长度数量的合理上限。