2016-12-01 19 views
2

我正在使用增強融合。我想要聲明一個模板函數,該函數將分配給地圖的一個字段並執行各種其他功能。我不能在我的生活中弄清楚如何獲取存儲在fusion :: map中的元素的類型。我相信這是可能的 - 我只是無法理解文檔。我想我有兩個問題:如何獲得boost :: fusion :: map中的值的類型?

  1. 我可能不會有正確的頭包括 - 編譯器抱怨不完全類型: 的boost ::融合::擴展:: value_of_data_impl
  2. 我並不清楚如何使用result_of,value_of_data等

爲了保持這個特定的最小測試用例如下所示。

#include <string> 
#include <boost/shared_ptr.hpp> 
#include <boost/fusion/include/container.hpp> 
#include <boost/fusion/container.hpp> 
#include <boost/fusion/iterator.hpp> 

using std::string; 

using namespace boost; 

namespace fields { 
    struct rgb; 
    struct gray; 
    struct keypoints; 
    struct edges; 
    struct objects; 
} 

typedef fusion::map< 
    fusion::pair<fields::rgb,  string>, 
    fusion::pair<fields::gray,  int>, 
    fusion::pair<fields::keypoints, int>, 
    fusion::pair<fields::edges,  int>, 
    fusion::pair<fields::objects, double> 
> Fields; 

Fields A_map; 

template<typename field> 
void Add(fusion::result_of::value_of_data<field> data) { 
    fusion::at_key<field>(A_map) = data; 
} 

int main() { 
    Add<fields::gray>(123); 
} 

功能添加應宣佈爲接收參數,該參數是灰色場(在本例INT)的類型。

+0

根據文檔'value_of_data'僅用於迭代器。我認爲你想要的元函數是'value_at_key'。如果是這樣,請回答這個問題,因爲我目前無法回答。 – llonesmiz

回答

2

@jv是的,這正是答案。非常感謝。

我只使用融合了幾個小時,並沒有在文檔中找到它(因爲迭代器上的函數在頂層是可見的,而value_at_key只有在挖掘到序列/內在時才顯示/ metafunctions)

此外我需要使用typename並解決了更簡單的包括。更正後的代碼是:

#include <string> 
#include <boost/fusion/include/sequence.hpp> 
#include <boost/fusion/include/map.hpp> 

using std::string; 

using namespace boost; 

namespace fields { 
    struct rgb; 
    struct gray; 
    struct keypoints; 
    struct edges; 
    struct objects; 
} 

typedef fusion::map< 
    fusion::pair<fields::rgb,  string>, 
    fusion::pair<fields::gray,  int>, 
    fusion::pair<fields::keypoints, int>, 
    fusion::pair<fields::edges,  int>, 
    fusion::pair<fields::objects, double> 
> Fields; 

Fields A_map; 

template<typename field> 
void Add(typename fusion::result_of::value_at_key<Fields, field>::type data) { 
    fusion::at_key<field>(A_map) = data; 
} 
+0

不要忘記接受你自己的答案(使用綠色勾號)。 – llonesmiz

相關問題