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

How can I get the type of a value in boost::fusion::map?

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

  1. 我可能没有包含正确的 headers - 编译器抱怨类型不完整: boost::fusion::extension::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);
}

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

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

我只使用了几个小时的融合,并没有在文档中找到它(因为迭代器上的函数在顶层可见,而 value_at_key 仅在您挖掘时显示向下进入 Sequence/intrinsic/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;
}