使用for_each中的transform进行Boost融合

时间:2016-03-14 15:46:35

标签: c++ boost boost-fusion

我正在尝试使用boost fusion构建一个小型C ++示例。但是,Visual Studio 2013为以下代码提供了构建错误。它应该简单地遍历一个关联结构并将所有成员名称打印到控制台:

#include <iostream>
#include <type_traits>
#include <boost/fusion/adapted/struct/define_assoc_struct.hpp>
#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/algorithm/transformation/zip.hpp>
#include <boost/fusion/algorithm/transformation/transform.hpp>

namespace keys
{
     struct name
     {};
    struct id
     {};
}

BOOST_FUSION_DEFINE_ASSOC_STRUCT((), Student,
    (std::string, name, keys::name)
    (int, id, keys::id)
);

struct getnames
{
    template<typename Sig>
    struct result;

    template <typename S, typename T>
    struct result<getnames(S, T)>
    {
        typedef std::string type;
    };

    template<class Struct, class N>
    typename result<getnames(Struct, N)>::type operator() (const N& i) const
    {
        return boost::fusion::extension::struct_member_name<Struct, i>::call();
    }
};

struct print
{
    template<typename Sig>
    struct result;

    template <typename T>
    struct result<print(T)>
    {
        typedef void type;
    };

    template<class S>
    void operator() (const S& i) const
    {
        std::cout << i << std::endl;
    };
};

int main()
{
    Student j = {"John", 42};
    auto names = boost::fusion::transform(j, getnames());
    boost::fusion::for_each(names, print());
    return 0;
}

这是我的错误:
boost/fusion/view/transform_view/detail/deref_impl.hpp(38): error C2039: 'type' : is not a member of 'boost::mpl::apply<boost::fusion::detail::apply_transform_result<getnames>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>' 还有四个由于第一个错误而出现的错误。

老实说,我不是使用助推融合的专家,所以也许我只是错过了一些重要的东西,而其他人可以帮助我。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。

1)在Functor getnames中,result类型的签名和operator()的签名不一致(一个接受一个参数,另一个接受两个参数)。

2)在operator()(const N& i)中,i是运行时变量。它不能在表达式boost::fusion::extension::struct_member_name<Struct, i>中显示为模板参数。

我不知道如何在不知道你想对getnames做什么的情况下提供帮助。首先尝试获得一致的代码。