我正在使用boost fusion。我想声明一个模板函数,它分配给一个地图的一个字段并执行各种其他功能。我不能为我的生活弄清楚如何获取存储在fusion :: map中的元素的类型。我确信这是可能的 - 我只是无法理解文档。我想我有两个问题:
为了保持这一点,我们将在下面显示最小的测试用例。
#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)。
答案 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;
}