从升压融合适配结构中获取成员类型列表

Getting a list of member types from a boost fusion adapted struct

提问人:Vladimir 提问时间:10/24/2019 更新时间:12/5/2019 访问量:280

问:

我有像这样的增强融合适应结构:

struct A {
    int x;
    double y;
    std::string z;
};
BOOST_FUSION_ADAPT_STRUCT(
    A,
    x,
    y,
    z
)

我想在编译时迭代改编的类型。例如,如果我有一个包装类型的类:

template <typename T> class Foo { ... };

那么我希望能够在给定我的结构 A 的情况下获得类型。我在这里仅举个例子;它可以是另一个可变参数类型模板类。std::tuple<Foo<int>, Foo<double>, Foo<std::string>>std::tuple

欢迎使用 c++17 解决方案。

C++ 模板-元编程boost-fusion

评论


答:

1赞 pure cuteness 12/5/2019 #1

用于将适应后的融合结构转换为类似以下内容的帮助程序:std::tuple

template<class Adapted, template<class ...> class Tuple = std::tuple>
struct AdaptedToTupleImpl
{
    using Size = boost::fusion::result_of::size<Adapted>;

    template<size_t ...Indices>
    static Tuple<typename boost::fusion::result_of::value_at_c<Adapted, Indices>::type...> 
        Helper(std::index_sequence<Indices...>);

    using type = decltype(Helper(std::make_index_sequence<Size::value>()));
};

template<class Adapted, template<class ...> class Tuple = std::tuple>
using AdaptedToTuple = typename AdaptedToTupleImpl<Adapted, Tuple>::type;

验证:

using AsTuple = AdaptedToTuple<A>;
static_assert(std::is_same_v<std::tuple<int, double, std::string>, AsTuple>);

将元函数应用于元组中每个类型的帮助程序:

template<class List, template<class> class Func> struct ForEachImpl;

template<class ...Types, template<class ...> class List, template<class> class Func>
struct ForEachImpl<List<Types...>, Func>
{
    using type = List<Func<Types>...>;
};

template<class List, template<class> class Func>
using ForEach = typename ForEachImpl<List, Func>::type;

验证:

static_assert(std::is_same_v<ForEach<AsTuple, std::add_pointer_t>, std::tuple<int*, double*, std::string*>>);

还可以看看图书馆。它具有等同于上述功能的元功能。Boost.MP11mp_transformForEach