如何在boost :: fusion :: map中获取值的类型?

时间:2016-12-01 07:56:54

标签: c++ templates boost boost-fusion

我正在使用boost fusion。我想声明一个模板函数,它分配给一个地图的一个字段并执行各种其他功能。我不能为我的生活弄清楚如何获取存储在fusion :: map中的元素的类型。我确信这是可能的 - 我只是无法理解文档。我想我有两个问题:

  1. 我可能没有包含正确的标题 - 编译器抱怨类型不完整: 升压::融合::扩展:: value_of_data_impl
  2. 我一点也不清楚如何使用result_of,value_of_data等
  3. 为了保持这一点,我们将在下面显示最小的测试用例。

    #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);
    }
    

    应该声明函数Add以接收一个参数,该参数是 gray 字段的类型(示例中为int)。

1 个答案:

答案 0 :(得分:2)

@jv是的,这正是答案。非常感谢。

我只使用了几个小时的融合,并且在文档中没有找到(因为迭代器上的函数在顶层可见,而value_at_key只在你深入到Sequence / intrinsic /时出现)元函数)

此外,我需要使用 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;
}