2016-12-01 55 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