2016-11-20 76 views
2

我想學習boost mpl,試過一個非常簡單的例子來計算一個類型出現在mpl map中的次數。可能有人解釋爲什麼這個程序的輸出爲0boost mpl count爲簡單例子

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 

的發生。這到底是一個int,因爲在MPL的描述:: key_type的,你會發現:

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

好了,讓我們看看你有什麼地圖的實際內容。 我只能寫出地圖的類型,但我想告訴你如何檢查類型的快速和懶惰的方式。 :P

所以,我們只是讓編譯器無法看到地圖的類型是什麼。 我的地方加入這一行做到了:

typename m::blaa BB; 

當然,編譯失敗(因爲blaa不是mpl::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 

好吧,我們可以閱讀的是,該地圖包含對的列表(例如,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;