代わりの場合にネストのスイッチとしてタイプリストのランタイムtypeswitch?

StackOverflow https://stackoverflow.com/questions/2157149

  •  23-09-2019
  •  | 
  •  

質問

このは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のために使われています。質問です - 彼らはネストされた場合の一連を経てこれをやっています。単一の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は、上、あなたのプログラムになりますtypelistに長さの数にバインドされ、いくつかの合理的であり、Nのtype_switch::operator()を展開することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top