当前位置:  开发笔记 > 编程语言 > 正文

Boost Fusion变换类型操作和as_vector

如何解决《BoostFusion变换类型操作和as_vector》经验,为你挑选了1个好方法。

我试图了解使用Fusion的重点,并且我对这个简单的例子感到难过:

#include 
#include 
#include 
#include 

template< typename T >
struct S {
    typedef T type;
};

struct S_f {
    template< typename T >
    struct result {
        typedef typename T::type type;
    };
};

int main () {
    using namespace boost;
    typedef fusion::vector> from_type;
    BOOST_MPL_ASSERT((fusion::traits::is_sequence< fusion::vector< int > > ));

    typedef fusion::result_of::transform< from_type, S_f >::type to_type;
    BOOST_MPL_ASSERT((fusion::traits::is_sequence< to_type > ));

    typedef fusion::result_of::as_vector< to_type >::type value_type; // error
}

断言通过,但value_type的typedef失败,错误如下.我无法为代码和文档之间的任何差异提供资金,也无法在stackoverflow或boost邮件列表的其他地方补救.

AFAICT代码是正确的:应用变换元函数的结果是transform_view,transform_view是一个序列,如传递断言所示.然而,as_vector元函数在transform_view上的应用失败了.是什么赋予了?!

任何帮助表示赞赏.我对混合mpl不感兴趣.我知道我可以通过MPL和一些关于类型操作的融合问题绕道而行,这些问题有关于类型操作的答案,主张MPL.根据文档,我不需要MPL.

clang++ -std=c++1z -c t.cpp
In file included from main.cpp:4:
In file included from /usr/local/include/boost/fusion/include/transform.hpp:11:
In file included from /usr/local/include/boost/fusion/algorithm/transformation/transform.hpp:11:
In file included from /usr/local/include/boost/fusion/view/transform_view/transform_view.hpp:15:
In file included from /usr/local/include/boost/fusion/view/transform_view/transform_view_iterator.hpp:18:
/usr/local/include/boost/fusion/view/transform_view/detail/value_of_impl.hpp:37:74: error: no type named 'type' in 'boost::mpl::apply, S, mpl_::na, mpl_::na, mpl_::na, mpl_::na>'
                typedef typename mpl::apply::type type;
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
/usr/local/include/boost/fusion/iterator/value_of.hpp:52:15: note: in instantiation of template class 'boost::fusion::extension::value_of_impl::apply, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, 0>, S_f> >' requested here
            : extension::value_of_impl::type>::
              ^
/usr/local/include/boost/fusion/container/vector/detail/cpp03/preprocessed/as_vector10.hpp:19:49: note: in instantiation of template class 'boost::fusion::result_of::value_of, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, 0>, S_f> >' requested here
            typedef typename fusion::result_of::value_of::type T0;
                                                ^
/usr/local/include/boost/fusion/container/vector/convert.hpp:26:17: note: in instantiation of template class 'boost::fusion::detail::barrier::as_vector<1>::apply, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, 0>, S_f> >' requested here
                template apply::type>::type
                ^
main.cpp:26:32: note: in instantiation of template class 'boost::fusion::result_of::as_vector, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_>, S_f, boost::fusion::void_> >' requested here
    typedef fusion::result_of::as_vector< to_type >::type value_type; // error
                               ^
1 error generated.

Barry.. 6

模板元编程的问题在于,当您未能满足元函数的前提条件时,您会遇到许多无意义的错误.要求的transform是,F是一元多态函数对象.对文档中的内容的解释有点弱,但您可以从示例中看出:这是一个可以使用参数调用的对象.也就是说,result_of::type需要形成良好的形式.

你要传递的transform是:

struct S_f {
    template< typename T >
    struct result {
        typedef typename T::type type;
    };
};

那不是多态函数对象.它也不是一个元函数类.这不是Boost.Fusion和Boost.MPL能够理解的东西.这个特别令人困惑的地方是transform<>元函数是懒惰的 - 所以看起来你正确地做了那个部分.只是as_vector<>因为实际应用了转换,所以它看起来就像故障点所在.

要将其转换为多态函数对象,只需将嵌套result类模板更改为调用运算符:

struct S_f {
    template< typename T >
    typename T::type operator()(T );
};

没有必要定义,因为你实际上并没有调用它.使用该修复程序,您的代码将进行编译.



1> Barry..:

模板元编程的问题在于,当您未能满足元函数的前提条件时,您会遇到许多无意义的错误.要求的transform是,F是一元多态函数对象.对文档中的内容的解释有点弱,但您可以从示例中看出:这是一个可以使用参数调用的对象.也就是说,result_of::type需要形成良好的形式.

你要传递的transform是:

struct S_f {
    template< typename T >
    struct result {
        typedef typename T::type type;
    };
};

那不是多态函数对象.它也不是一个元函数类.这不是Boost.Fusion和Boost.MPL能够理解的东西.这个特别令人困惑的地方是transform<>元函数是懒惰的 - 所以看起来你正确地做了那个部分.只是as_vector<>因为实际应用了转换,所以它看起来就像故障点所在.

要将其转换为多态函数对象,只需将嵌套result类模板更改为调用运算符:

struct S_f {
    template< typename T >
    typename T::type operator()(T );
};

没有必要定义,因为你实际上并没有调用它.使用该修复程序,您的代码将进行编译.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有