使用for_each中的变换促进融合

Boost fusion using transform in for_each

本文关键字:变换 融合 for each 使用      更新时间:2023-10-16

我正在尝试使用boost融合构建一个小的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)在函子getnames中,result类型的签名和operator()的签名不一致(一个取一个参数,另一个取两个)。

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

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