2011-07-16 11 views
1

私はフュージョンセットを持っており、フュージョンマップに変換したいと思います。boost :: fusion :: boost :: fusion :: mapをboost :: fusion :: foldに変換します。

#include <cstdlib> 
#include <iostream> 

#include <boost/fusion/include/fold.hpp> 
#include <boost/fusion/include/map.hpp> 
#include <boost/fusion/include/make_map.hpp> 
#include <boost/fusion/include/push_back.hpp> 
#include <boost/fusion/include/pair.hpp> 
#include <boost/fusion/container/set.hpp> 
#include <boost/fusion/include/for_each.hpp> 
#include <boost/fusion/include/at_key.hpp> 

struct node_base 
{ 
    int get() {return 123;} 
}; 
struct node_a : public node_base 
{ 
node_a(){std::cout << "node_a::Ctor"<< std::endl;} 
}; 
struct node_b : public node_base 
{ 
node_b(){std::cout << "node_b::Ctor"<< std::endl;} 
}; 
struct node_c : public node_base 
{ 
node_c(){std::cout << "node_c::Ctor"<< std::endl;} 
}; 

typedef ::boost::fusion::set<node_a,node_b,node_c> my_fusion_set; 
my_fusion_set my_set; 

struct push_back_map 
{ 
    typedef ::boost::fusion::map<> result_type; 

    template<class NODE> 
    ::boost::fusion::map<> operator() (const ::boost::fusion::map<> & m, const NODE & n) 
    { 
    return ::boost::fusion::push_back(
     m 
     , ::boost::fusion::make_pair<NODE>(n) 
     ); 
    } 
}; 

::boost::fusion::map<> my_map = 
::boost::fusion::fold(
    my_set 
    , ::boost::fusion::map<>() 
    , push_back_map() 
    ); 

struct print_map 
{ 
    template<class P> 
    void operator()(P & p) const 
    { 
    std::cout << p.second.get() << std::endl; 
    } 
}; 

int main() 
{ 
    ::boost::fusion::for_each(my_map, print_map()); 
    std::cout << ::boost::fusion::at_key<node_a>(my_set).get() << std::endl; 
    //std::cout << ::boost::fusion::at_key<node_a>(my_map).second.get() << std::endl; 
    system("pause"); 
    return 0; 
} 

このコードはコンパイルされます。しかし、my_mapの結果を表示することはできませんでした。 my_setが正常に構築されます。 my_mapは、各要素の元の型をキーとして、そのインスタンスオブジェクトをデフォルトのコンストラクターから値としてmy_setから単純に変換されます。 my_mapがfusion :: foldから正常に作成されたかどうかは疑問です。 my_setはfusion :: at_key <>を呼び出して照会できますが、at_key <のmy_mapは機能しません。 ありがとう!

答えて

2

fusion::mapfusion::setからfoldに作成する簡潔な方法を考えることができませんでした。 この回答はあなたの質問を直接解決するものではありません。 これは、これがあなたにいくつかのヒントを与える場合に備えて投稿します。
いかが タイプリスト準備(中my_typesなどを以下)、および 直接fusion::setからfusion::mapを作成し、そのリスト の代わりからfusion::setfusion::map作成しますか?例えば
:ここ

namespace bf = boost::fusion; 
namespace bm = boost::mpl; 

typedef bm::vector<node_a,node_b,node_c> my_types; 
typedef bm::fold< 
      my_types 
     , bm::vector<> 
     , bm::push_back< bm::_1, bf::pair< bm::_2, bm::_2 > > 
     >::type my_map_types; 

int main() { 
    bf::result_of::as_set<my_types>::type my_set; 
    bf::result_of::as_map<my_map_types>::type my_map; 
    std::cout << bf::at_key<node_a>(my_set).get() << std::endl; 
    std::cout << bf::at_key<node_a>(my_map).get() << std::endl; 
} 

ideoneに対する試験です。 ちなみに、fusion::mapのkey-typeとvalue-typeが常に の場合、fusion::setはその目的を達成します。

+0

ありがとうございました!これは本当に役立ちます:) – Multithrdi

関連する問題