折叠后如何获得标准mpl序列

时间:2015-02-18 14:06:26

标签: templates c++11 variadic-templates boost-mpl

如果我使用boost :: mpl,请看下面的代码:

typedef fold<
  vector<long,float,long>
, set0<>
, insert<_1,_2>
>::type s;

BOOST_MPL_ASSERT_RELATION( size<s>::value, ==, 2 );

如何将s再次转换为t = boost::mpl::set<long,float>类型,以便我可以使用t选择部分专用的模板函数(在boost :: mpl :: set``上)提取元素类型并将其转换为std::tuple<long,float>。这是其他的东西

1 个答案:

答案 0 :(得分:1)

这是一个完整的例子。我调用了元函数Unify,但显然你可以随意调用它 它是如何工作的非常简单,它只是一次一个地从输入序列中删除元素,并构建一个可变列表并在最后将它们转储到所需的序列类型。

    #include <boost/mpl/set.hpp>
    #include <boost/mpl/front.hpp>
    #include <boost/mpl/size.hpp>
    #include <boost/mpl/insert.hpp>
    #include <boost/mpl/erase_key.hpp>
    #include <tuple>

    template <template <class...> class OutSeqType,
              class Sequence,
              std::size_t nSeqSize,
              class ... Elements>
    struct Unify
    {
        typedef typename boost::mpl::front<Sequence>::type Next;
        typedef typename Unify<
            OutSeqType,
            typename boost::mpl::erase_key<Sequence, Next>::type,
            nSeqSize - 1, Next, Elements...>::type type;
    };

    template <template <class...> class OutSeqType,
              class Sequence,
              class ... Elements>
    struct Unify<OutSeqType, Sequence, 0ul, Elements...>
    {
        typedef OutSeqType<Elements...> type;
    };

    int main()
    {
        typedef boost::mpl::insert<
            boost::mpl::insert<
                boost::mpl::insert<
                    boost::mpl::set<>,
                    int>::type,
                float>::type,
            int*>::type Set;

        typedef Unify<
            std::tuple,
            Set,
            boost::mpl::size<Set>::type::value
            >::type Set2;

        //This compile error will print the type of Set2
        Set2::asdfl;
    }

出于某种原因,我不确定我是否pop_front使用set,因此我使用erase_key代替{{1}}。这将它限制为关联容器,但它可以推广到任何类型的容器,只需要更多的工作。我会把它留作练习。