这是从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);
        }
      }
  };

它用于typeswitching上类型串。问题是 - 他们通过一系列嵌套if的的事情了。有没有办法做到这一点型交换机作为一个SELECT语句呢?

谢谢!

有帮助吗?

解决方案

您将需要预处理器生成一个大switch。你需要get<>到无操作的输出限制的查找。检查编译器输出,以确保未使用的情况下,没有产生输出,如果你关心;根据需要调整; v)的

查看升压预处理器库,如果你不在乎这样的事情,以获得良好的...

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.
      }
  };

其他提示

我不这么认为。

这种模板元编程的通常与递归方法来实现。由于这一切发生在编译时,我就不会,如果没有运行递归或条件检查惊讶。

您可以随时使用二进制搜索,而不是线性搜索。这将是更为复杂和更可能具有在它的错误(二进制搜索是非常容易弄乱)。

您也可以手动展开N个type_switch::operator(),其中N是一些合理的,你会在你的节目类型串长度的数量上限。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top