2017-01-12 4 views
2

しかし、私は次のコードをtweek、私は行方不明のように思われる。それはコンパイルされません。私は2つのマップint - > intを持っています。私は2つのオリジナルからのすべてのキーと値のペアを含む3番目のint - > intマップを生成したいと思います。 (VS2013)誰ですか?新しいマップを作成する2つのmplマップをマージするにはどうすればよいですか?

#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

コードには2つの問題があります。簡単なものはここにあります:

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_inserterpush_back()介して出力OutputIteratorを作成std::back_inserterのメタプログラミングと同等です。同様に、back_inserterは、mpl::push_backを使用しているため、「逆拡張可能シーケンス」が必要です。 mpl::mapは、逆拡張可能シーケンスではありません。 referenceを見ると、push_backはなく、insertしかありません。だから、それを実行する必要があります。

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

(えー、実際には、mpl::insertは3つの引数とmpl::quote3を取る不履行のために許可していない私はかなりmpl::quoteが何をしているかを理解していないが、それは壊れているようです最後の議論)。あなたが書く場合:

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

その後、あなただけ書かれている可能性があり:ØyvindRoth心配はありません@

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

を。ようこそ。 [誰かが答えるときに私はどうすればいいですか?](http://stackoverflow.com/help/someone-answers)を見てください。 – Barry

関連する問題