如何将type和mpl::vector连接成一个新的vector

How to join type and mpl::vector into a new vector

本文关键字:vector 一个 连接 type mpl      更新时间:2023-10-16

我使用下面的构造来创建一个mpl向量,类型为:

struct Struct1{
    typedef int type;
};
struct Struct2{
    typedef float type;
};
template<typename T> struct TypeReader{
    typedef typename T::type type;
};
int main()
{
    typedef bm::vector<Struct1,Struct2> MPLVector;
    typedef bm::transform<MPLVector, TypeReader<bm::_1>>::type TypeList;
    static_assert(bm::equal<TypeList, bm::vector<int,float> >::value, "Is not same");
}
到目前为止,这是预期的工作。现在我要做的是下面的
struct Struct3{
    typedef bm::vector<char,double> type;
};
typedef bm::vector<Struct1,Struct2,Struct3> MPLVector;
typedef bm::transform<MPLVector, TypeReader<bm::_1>>::type TypeList;
static_assert(bm::equal<TypeList, bm::vector<int,float,char,double> >::value, "Is not same");

这不起作用。那么我需要如何改变我的metfunction结构,它将与两者一起工作,只是一个类型定义和一个mpl::vector?
或者如果这是不可能的如果我改变所有类型的类型定义为mpl向量是否有可能做到这一点?

我认为这对于mpl::transform是不可能的,因为它需要从源序列中的单个元素生成结果序列中的多个元素。然而,这可以用mpl::fold来完成,以及mpl::is_sequence的专门化:

// Default case
template < typename Seq, typename TWrapper, typename Enable = void >
struct Flatten_imp
    : mpl::push_back< Seq, typename TWrapper::type >
{
};
// Sequence case
template < typename Seq, typename TWrapper >
struct Flatten_imp< 
    Seq,
    TWrapper, typename
    boost::enable_if< 
        mpl::is_sequence< typename 
            TWrapper::type 
        > 
    >::type
>   
{
    typedef mpl::joint_view< 
        Seq, typename 
        TWrapper::type 
    > type;
};
template < typename Seq >
struct Flatten
    : mpl::fold< Seq, mpl::vector<>, Flatten_imp< mpl::_, mpl::_ > >
{}
int main()
{
    typedef mpl::vector< Struct1, Struct2, Struct3 > MPLVector;
    typedef Flatten< MPLVector >::type TypeList;
    static_assert(
        mpl::equal<
            TypeList, 
            mpl::vector< int, float, char, double > 
        >::value, "Is not same");
}

如果你希望平整化是递归的,你可以在Flatten_impl中调用Flatten来平整化序列,然后再追加它;但是,要注意,这种递归只在序列包含包装器而不包含直接类型(例如

)时才会起作用。
struct Struct3
{
    typedef mpl::vector< mpl::identity< char >, mpl::identity< double > > type;
}

你必须专门TypeReader的情况下,参数是一个序列(mpl向量,融合列表/向量/元组);

在这种情况下,结合 mpl::back_inserter mpl::copy 的功能(从参数的Sequence复制到目标类型)

我现在没有时间来演示这个。关于如何专门化序列的概念的提示,您可以查看boost::enable_if。然而,概念验证可以很容易地完成,只需专注于template <typename> mpl::vector

相关文章: