boost :: fusion :: result_of :: as_set (или as_vector), преобразованный из сложных (вложенных) последовательностей mpl - PullRequest
3 голосов
/ 06 июля 2011
#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<Sequence>' : 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

Преобразования из простых последовательностей mpl, таких как :: boost :: mpl :: vector , в последовательности слияния работают нормально. Но я получил ошибки времени компиляции, когда пытался преобразовать последовательность mpl после обработки из сложной последовательности mpl (например, вложенных векторов mpl) в последовательность слияния (через result_of :: as_set или as_vector).

Распечатка типа "restore_set_type":

struct node_c
struct node_b
struct node_a

, но кажется, что теряется некоторая информация о типе, что отличает ее от простой последовательности mpl :: boost :: mpl :: vector .

Я что-то пропустил, чтобы указать, например, тег, размер или? Спасибо!

1 Ответ

1 голос
/ 07 июля 2011

решение намного проще, чем кажется на первый взгляд!:)

Вы упустили что-то критическое:

typedef ::boost::fusion::result_of::as_set<restored_set_type> restored_fusion_set;

Неверно, вам нужно:

typedef ::boost::fusion::result_of::as_set<restored_set_type>::type restored_fusion_set;

Вы просто пропустили ::type отсюда тип из restored_fusion_set на самом деле as_set<restored_set_type> - это не то, что требуется.

...