我正在尝试使用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>'
还有四个由于第一个错误而出现的错误。
老实说,我不是使用助推融合的专家,所以也许我只是错过了一些重要的东西,而其他人可以帮助我。
答案 0 :(得分:1)
您的代码存在一些问题。
1)在Functor getnames
中,result
类型的签名和operator()
的签名不一致(一个接受一个参数,另一个接受两个参数)。
2)在operator()(const N& i)
中,i
是运行时变量。它不能在表达式boost::fusion::extension::struct_member_name<Struct, i>
中显示为模板参数。
我不知道如何在不知道你想对getnames
做什么的情况下提供帮助。首先尝试获得一致的代码。