根据键

时间:2015-06-24 21:51:42

标签: c++11 merge boost-fusion

我想要以某种方式合并两个boost::fusion::map。对于这两个地图,我想生成第三个,其中两个地图中都存在所有键,如果两个地图都存在,则添加值。例如:

#include <boost/fusion/container/map.hpp>
namespace bfn = boost::fusion;
using namespace boost::fusion;

struct x{};
struct y{};
struct z{};

int main(){

    auto m = make_map<x, y>(2, 4.3);
    auto n = make_map<x>(2.);
    auto l = accumulate_merge(m, n); // how this function should look like?
}

之后l将等同于make_map<x, y>(2 + 2., 4.3)

我不知道从哪里开始。我尝试从join开始(并删除重复项,但我很快就复杂了)。

Boost Fusion中是否有可以帮助我的工具?

(如果对于相同的密钥,两个相应的类型是不同的 - 但仍然可以添加 - 有很多细微之处,例如该怎么办。但是任何第一个版本都会有帮助。)

1 个答案:

答案 0 :(得分:0)

我设法使用boost::fusion::fold两次提出此版本。我不确定它是否(编译时)最佳。

基本上,我首先在第一张地图上迭代。如果键不在第二个映射中,则元素将被推送到结果。如果键位于第二个映射中,则添加元素和结果(无论何种类型被推送到结果)。

最后,我迭代第二张地图。如果键在第一个映射中,我会忽略它(因为它是在第一个映射中添加的)。如果键不在第二个元素中,则元素被推送到结果。

(结果是第一个地图优先考虑密钥类型的排序)

有一些悬而未决的问题或怀疑:

1)有一种更有效/更紧凑的方式来做到这一点

2)我不确定使用forward基本上我到处使用它(以防万一)

3)不确定函数返回中的autodecltype(auto)

4)这些功能不是SFINAE友好的,我可以添加防护来产生软错误。 (例如,如果无法添加值)。

5)结果没有任何自然顺序,我不知道这是算法的问题还是折叠,或者因为地图没有指定{{1 (毕竟它是一张地图)。

  

欢迎提出意见。

现在代码:

push_back