如何合并生成新地图的两张mpl地图?

时间:2017-01-12 14:59:38

标签: c++ c++11 template-meta-programming boost-mpl

但是我调整了以下代码,似乎有一点我不知道了。它不会编译。我有两个地图int - > INT。我想生成第三个int - > int map包含来自两个原件的所有键值对。 (VS2013)任何人?

#include <boost/mpl/map.hpp>
#include <boost/mpl/pair.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/copy.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/has_key.hpp>

typedef boost::mpl::map <
    boost::mpl::pair < boost::mpl::int_<7>, boost::mpl::int_<59>  >
>::type Original1;

typedef boost::mpl::map <
    boost::mpl::pair < boost::mpl::int_<11>, boost::mpl::int_<61>  >
>::type Original2;

typedef boost::mpl::copy <
    Original1,
    boost::mpl::back_inserter < Original2 >
>::type Merged;

BOOST_MPL_ASSERT((boost::mpl::has_key<Merged, 7>));

int _tmain(int argc, _TCHAR* argv[])
{

    const int i = boost::mpl::at<Merged, boost::mpl::int_<7> >::type::value;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的代码存在两个问题。简单的就在这里:

BOOST_MPL_ASSERT((boost::mpl::has_key<Merged, 7>));

键是类型,7不是类型。您想要检查密钥mpl::int_<7>

第二个是:

typedef boost::mpl::copy <
    Original1,
    boost::mpl::back_inserter < Original2 > // <==
>::type Merged;

mpl::back_inserterstd::back_inserter的元编程等效项,它创建一个OutputIterator,通过push_back()输出。同样,back_inserter需要一个&#34; Back Extensible Sequence&#34;因为它使用mpl::push_backmpl::map不是后可扩展序列。如果您查看其reference,则不会push_back,只会insert。所以你需要这样做:

using Merged =
    mpl::copy<
        Original1,
        mpl::inserter<Original2, mpl::insert<mpl::_1, mpl::_2>> // <==
    >::type;

我不太清楚mpl::quote正在做什么,但似乎已经破了(呃,实际上,mpl::insert需要3个参数而mpl::quote3不允许默认最后的论点)。如果你写:

template <template <class... > class F>
struct quote {
    template <class... Args>
    struct apply {
        using type = typename F<Args...>::type;
    };
};

然后你可以写完:

mpl::inserter<Original2, quote<mpl::insert>>