【问题标题】:How to obtain standard mpl sequence after fold折叠后如何获得标准mpl序列
【发布时间】:2015-02-18 14:06:26
【问题描述】:

如果我使用 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&lt;long,float&gt; 类型,以便我可以使用t 选择提取元素类型的部分专用模板函数(在 boost::mpl::set 上)并将其变成 std::tuple&lt;long,float&gt; 。这是另一回事

【问题讨论】:

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


【解决方案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;
    }

由于某种原因,我不确定我不能在set 上使用pop_front,所以我改用erase_key。这将它限制为关联容器,但它可以推广到任何类型的容器,需要更多的工作。我会把它留作练习。

【讨论】:

  • 很酷,谢谢,所以这个片段可以统一来自 mpl::transform 或 mpl::fold 等的任何东西?
  • @Gabriel 我相信 mpl 的想法是你不关心实际类型是什么,只要它按照你想要的方式运行。也就是说,我只是不确定,我从来没有真正找到过这样的功能,而是坚持“不关心什么它只是做我想要什么”的意识形态。
  • @Gabriel 它可以统一任何东西,包括已经统一的东西。您还可以统一到一个语义与源容器不同的容器中,例如我如何从一个集合移动到一个元组。
猜你喜欢
  • 2013-08-09
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多