C++ 如何将fusion::at_c或fusion::at_键应用于fusion::filter_if的结果?

C++ 如何将fusion::at_c或fusion::at_键应用于fusion::filter_if的结果?,c++,boost-fusion,C++,Boost Fusion,我在一个项目中使用boost::fusion。这是我第一次使用它,事情变得越来越复杂。我编写了以下程序: #include <iostream> #include <boost/mpl/bool.hpp> #include <boost/mpl/placeholders.hpp> #include <boost/fusion/include/map.hpp> #include <boost/fusion/include/filter_if

我在一个项目中使用boost::fusion。这是我第一次使用它,事情变得越来越复杂。我编写了以下程序:

#include <iostream>

#include <boost/mpl/bool.hpp>
#include <boost/mpl/placeholders.hpp>

#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/filter_if.hpp>
#include <boost/fusion/include/pair.hpp>
#include <boost/fusion/include/for_each.hpp>
#include <boost/fusion/include/at.hpp>
#include <boost/fusion/include/at_key.hpp>
#include <boost/fusion/include/io.hpp>

#include <boost/type_traits/is_integral.hpp>

#include <iostream>
#include <assert.h>
#include <typeinfo>


struct x{};
struct y{};
struct z{};

using namespace boost;

template <typename FPair>
struct IsIntegral{
    typedef
    typename mpl::bool_<
               is_integral<
                 typename FPair::second_type
               >::value
             > type;
};


template<typename T>
struct inc_imp
{
    void operator()(T&t)
    {
        t++;
    }
};

template<typename id, typename Data>
struct inc_imp<boost::fusion::pair<id,Data> >
{
    void operator ()(boost::fusion::pair<id,Data> &t)
    {
        t.second++;
    }
};

struct inc
{
    template<typename T>
    void operator()(T& t) const
    {
        inc_imp<T>()(t);
    }
};


int main()
{
    typedef fusion::vector<int,double,int,int> v_t;
    typedef fusion::result_of::filter_if<
              fusion::vector<int,double,int,int>
            , is_same<mpl::placeholders::_1, int>
            >::type view_v_t;

    v_t v(1,2,3,4);
    view_v_t const view_v(v);

    fusion::at_c<0>(v)      = 1; // just to test, fine!
    //fusion::at_c<0>(view_v) = 0; // Error1

    std::cout << "vector----------" << std::endl;
    std::cout << view_v << "  " << v << std::endl;
    fusion::for_each(view_v,inc());
    std::cout << view_v << "  " << v << std::endl;

    typedef fusion::map<
              fusion::pair<x,int>
            , fusion::pair<y,int>
            , fusion::pair<z,double>
            > m_t;

    typedef fusion::result_of::filter_if<
              m_t
            , IsIntegral<
                mpl::placeholders::_1
              >
            >::type view_m_t;

    m_t m(10,11,12);
    view_m_t view_m(m);

    fusion::at_key<x>(m)      = 10;// just to test, fine!
    //fusion::at_key<x>(view_m) = 10;// Error2

    std::cout << "map-------------" << std::endl;
    std::cout << view_m << "  " << m << std::endl;
    fusion::for_each(view_m,inc());
    std::cout << view_m << "  " << m << std::endl;

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#include,它返回前向序列的模型(即向量的情况)或关联序列的模型(即映射的情况)。因此,给出错误的两条线应该可以正常工作。我猜我在这里遗漏了一些明显的东西(可能是一个包含?),但我无法让它工作


提前感谢您的帮助

at_c
需要一个
随机访问序列
,这是对
前向序列
的改进,因此这可能解释了第一个错误(
过滤器视图
仅返回模型
前向序列
)。但是,在第二种情况下,
filter\u视图
应该建模
关联容器
,因此在_键
处调用
应该可以正常工作。您使用的是哪个版本的Boost?您的问题没有问题,3年前已解决。你尝试过更新你的库版本吗?我刚刚尝试过Boost 1.44,并且
在_key(view)
正常工作<但是,at_c的代码>仍然失败。也许改变了这一点,但我不这么认为:由于视图的实现方式,我认为在过滤视图的情况下不可能保留底层序列的随机访问性质(可能是因为元素的数量甚至不知道,因为元素在迭代过程中被过滤)。其他视图,如
transform\u视图
,没有这个问题。
at\u c
需要一个
随机访问序列
,它是
前向序列
的细化,因此可能解释了第一个错误(
过滤器视图
仅返回模型
前向序列
)。但是,在第二种情况下,
filter\u视图
应该建模
关联容器
,因此在_键
处调用
应该可以正常工作。您使用的是哪个版本的Boost?您的问题没有问题,3年前已解决。你尝试过更新你的库版本吗?我刚刚尝试过Boost 1.44,并且
在_key(view)
正常工作<但是,at_c的代码>仍然失败。也许改变了这一点,但我不这么认为:由于视图的实现方式,我认为在过滤视图的情况下不可能保留底层序列的随机访问性质(可能是因为元素的数量甚至不知道,因为元素在迭代过程中被过滤)。其他视图,如
transform\u视图
,没有此问题。
/usr/include/boost/fusion/sequence/intrinsic/at.hpp: In instantiation of ‘boost::fusion::result_of::at<const boost::fusion::filter_view<boost::fusion::vector<int, double, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, boost::is_same<mpl_::arg<1>, int> >, mpl_::int_<0> >’:
/usr/include/boost/fusion/sequence/intrinsic/at.hpp:64:   instantiated from ‘boost::fusion::result_of::at_c<const boost::fusion::filter_view<boost::fusion::vector<int, double, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, boost::is_same<mpl_::arg<1>, int> >, 0>’
../main.cpp:81:   instantiated from here
/usr/include/boost/fusion/sequence/intrinsic/at.hpp:59: error: invalid use of incomplete type ‘struct boost::fusion::extension::at_impl<boost::fusion::filter_view_tag>::apply<const boost::fusion::filter_view<boost::fusion::vector<int, double, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, boost::is_same<mpl_::arg<1>, int> >, mpl_::int_<0> >’
/usr/include/boost/fusion/sequence/intrinsic/at.hpp:30: error: declaration of ‘struct boost::fusion::extension::at_impl<boost::fusion::filter_view_tag>::apply<const boost::fusion::filter_view<boost::fusion::vector<int, double, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, boost::is_same<mpl_::arg<1>, int> >, mpl_::int_<0> >’
../main.cpp: In function ‘int main()’:
../main.cpp:81: error: no matching function for call to ‘at_c(const main()::view_v_t&)’
make: *** [main.o] Error 1
/usr/include/boost/fusion/sequence/intrinsic/at_key.hpp: In instantiation of ‘boost::fusion::result_of::at_key<const boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x>’:
../main.cpp:105:   instantiated from here
/usr/include/boost/fusion/sequence/intrinsic/at_key.hpp:55: error: invalid use of incomplete type ‘struct boost::fusion::extension::at_key_impl<boost::fusion::filter_view_tag>::apply<const boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x>’
/usr/include/boost/fusion/sequence/intrinsic/at_key.hpp:29: error: declaration of ‘struct boost::fusion::extension::at_key_impl<boost::fusion::filter_view_tag>::apply<const boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x>’
/usr/include/boost/fusion/sequence/intrinsic/at_key.hpp: In instantiation of ‘boost::fusion::result_of::at_key<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x>’:
/usr/include/boost/utility/enable_if.hpp:63:   instantiated from ‘boost::lazy_disable_if_c<false, boost::fusion::result_of::at_key<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x> >’
/usr/include/boost/utility/enable_if.hpp:70:   instantiated from ‘boost::lazy_disable_if<boost::is_const<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > > >, boost::fusion::result_of::at_key<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x> >’
../main.cpp:105:   instantiated from here
/usr/include/boost/fusion/sequence/intrinsic/at_key.hpp:55: error: invalid use of incomplete type ‘struct boost::fusion::extension::at_key_impl<boost::fusion::filter_view_tag>::apply<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x>’
/usr/include/boost/fusion/sequence/intrinsic/at_key.hpp:29: error: declaration of ‘struct boost::fusion::extension::at_key_impl<boost::fusion::filter_view_tag>::apply<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x>’
In file included from /usr/include/boost/fusion/support/tag_of.hpp:10,
                 from /usr/include/boost/fusion/support/category_of.hpp:11,
                 from /usr/include/boost/fusion/container/map/map.hpp:11,
                 from /usr/include/boost/fusion/container/map.hpp:11,
                 from /usr/include/boost/fusion/include/map.hpp:10,
                 from ../main.cpp:8:
/usr/include/boost/utility/enable_if.hpp: In instantiation of ‘boost::lazy_disable_if_c<false, boost::fusion::result_of::at_key<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x> >’:
/usr/include/boost/utility/enable_if.hpp:70:   instantiated from ‘boost::lazy_disable_if<boost::is_const<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > > >, boost::fusion::result_of::at_key<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x> >’
../main.cpp:105:   instantiated from here
/usr/include/boost/utility/enable_if.hpp:63: error: no type named ‘type’ in ‘struct boost::fusion::result_of::at_key<boost::fusion::filter_view<boost::fusion::map<boost::fusion::pair<x, int>, boost::fusion::pair<y, int>, boost::fusion::pair<z, double>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, IsIntegral<mpl_::arg<1> > >, x>’
../main.cpp: In function ‘int main()’:
../main.cpp:105: error: no matching function for call to ‘at_key(main()::view_m_t&)’
make: *** [main.o] Error 1