#include <iostream>
#include <boost/fusion/mpl.hpp>
#include <boost/fusion/include/mpl.hpp>
#include <boost/fusion/container/set.hpp>
#include <boost/fusion/include/at_key.hpp>
#include <boost/fusion/include/as_set.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/set.hpp>
#include <boost/mpl/front.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/insert.hpp>
struct node_base
{
int get() {return 123;}
};
struct node_a : public node_base
{};
struct node_b : public node_base
{};
struct node_c : public node_base
{};
typedef boost::mpl::vector3<
::boost::mpl::vector1<node_a>
,::boost::mpl::vector1<node_b>
,::boost::mpl::vector1<node_c>
>::type nested_vec_type;
typedef ::boost::mpl::fold<
nested_vec_type
, ::boost::mpl::set<>
, ::boost::mpl::insert<
::boost::mpl::placeholders::_1
, ::boost::mpl::front<::boost::mpl::placeholders::_2>
>
>::type restored_set_type;
typedef ::boost::fusion::result_of::as_set<restored_set_type> restored_fusion_set;
restored_fusion_set my_restored_set;
int main()
{
std::cout << boost::fusion::at_key<node_a>(my_restored_set).get() << std::endl;
std::cout << boost::fusion::at_key<node_b>(my_restored_set).get() << std::endl;
std::cout << boost::fusion::at_key<node_c>(my_restored_set).get() << std::endl;
return 0;
}
error C2039: 'category' : is not a member of 'boost::fusion::result_of::as_set<Sequence>'
error C2039: 'type' : is not a member of 'boost::fusion::result_of::end<Sequence>'
error C2504: 'boost::fusion::extension::end_impl<Tag>::apply<Sequ开发者_开发技巧ence>' : base class undefined
error C2039: 'type' : is not a member of 'boost::fusion::result_of::begin<Sequence>'
error C2504: 'boost::fusion::extension::begin_impl<Tag>::apply<Sequence>' : base class undefined
error C2065: 'type' : undeclared identifier
The conversions from simple mpl sequences like ::boost::mpl::vector< node_a, node_b, node_c > to fusion sequences work fine. But I got compile-time errors when I was trying to convert a after-processed mpl sequence from a complex mpl sequence (like nested mpl vectors) to a fusion sequence (through result_of::as_set or as_vector).
The print out of "restored_set_type" is:
struct node_c
struct node_b
struct node_a
, but it seems to lose some type information, which makes it different from a simple mpl sequence ::boost::mpl::vector< node_c, node_b, node_a > .
Did I miss anything to specify, like tag, size, or? Thanks!
the solution is a lot simpler than it first appears! :)
You've missed out something critical:
typedef ::boost::fusion::result_of::as_set<restored_set_type> restored_fusion_set;
Is incorrect, what you need is:
typedef ::boost::fusion::result_of::as_set<restored_set_type>::type restored_fusion_set;
You simply missed ::type
hence the type of restored_fusion_set
is actually as_set<restored_set_type>
- which is not what is required.
精彩评论