2016-11-20 7 views
2

私はboost mplを学習しようとしていますが、mpl mapにタイプが現れる回数を数えるための非常に単純な例を試しました。このプログラムの出力は0簡単な例のためにmplの数を増やす

typedef map< 
      pair<int, unsigned> 
      , pair<char, unsigned char> 
      , pair<long_<5>, char[17]> 
      , pair<int[42], bool> 
      > m; 


    std::cout << mpl::count < 
          m, 
          mpl::key_type 
            < 
            m, 
            pair<int, unsigned> 
            >::type 
          >::type::value << std::endl; 

答えて

2

である理由を誰かが説明できるコードで書かれているものによると、あなたのマップタイプ

key_type< 
    m, 
    pair<int, unsigned> 
>::type 

の発生をカウントしたいと思います。最後に、これは理由MPLの説明でintです::あなたが見つけるkey_type:

key_type<m,x>::type   Identical to x::first; 

さて、それでは、あなたのマップの実際の内容が何であるかを見てみましょう。 マップのタイプを書き込むことができますが、タイプを素早く怠惰にチェックする方法を示したいと思います。 :P

私たちは、コンパイラにマップの種類が何であるかを見せないようにします。 私はどこかにこの行を追加することでそれをやった:

typename m::blaa BB; 

を(blaampl::map型の要素ではないので)当然のコンパイルが次のエラーメッセージで失敗します

error: 'blaa' in 'm {aka struct boost::mpl::map<boost::mpl::pair<int, unsigned int>, boost::mpl::pair<char, unsigned char>, boost::mpl::pair<mpl_::long_<5l>, char [17]>, boost::mpl::pair<int [42], bool> >}' does not name a type 

[OK]を、私たちマップにペアのリスト(たとえば、boost::mpl::pair<int, unsigned int>)、 が含まれていますが、intは含まれていないことです。そしてあなたのmpl::count電話であなたはintを探しています。

std::cout行を と置き換えると、結果は期待どおりになることがわかります。

std::cout << 
    boost::mpl::count< m, 
     boost::mpl::pair<int, unsigned> 
    >::type::value 
<< std::endl; 
関連する問題