【问题标题】:Getting a list of member types from a boost fusion adapted struct从 boost fusion 适应结构中获取成员类型列表
【发布时间】:2019-10-24 02:05:46
【问题描述】:

我有类似这样的 boost fusion 适应结构:

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&lt;Foo&lt;int&gt;, Foo&lt;double&gt;, Foo&lt;std::string&gt;&gt;。我在这里使用 std::tuple 作为示例;它可以是另一个可变参数类型的模板类。

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

【问题讨论】:

    标签: c++ template-meta-programming boost-fusion


    【解决方案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.MP11 库。它具有mp_transform 元函数,相当于上述ForEach 函数。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多