【问题标题】:How can I get the type of a value in boost::fusion::map?如何在 boost::fusion::map 中获取值的类型?
【发布时间】:2016-12-01 07:56:53
【问题描述】:

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

  1. 我可能没有包含正确的标题 - 编译器抱怨类型不完整: 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)。

【问题讨论】:

  • 根据文档,value_of_data 仅用于迭代器。我认为您想要的元功能是value_at_key。如果是,请回答这个问题,因为我现在不能。

标签: c++ templates boost boost-fusion


【解决方案1】:

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

我只使用了 fusion 几个小时,但在文档中没有发现(因为迭代器上的函数在顶层可见,而 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多