ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

c++11模拟boost元占位符placeholder(1/4)

来源:网络整理     时间:2015-11-15     关键词:索引

本篇文章主要介绍了"c++11模拟boost元占位符placeholder",主要涉及到索引方面的内容,对于C/C++jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 准备实现meta programming的fold函数,发现自己缺少占位符实现,这样传入fold的transform op类(元函数)都不得不另外写个外覆类,其...

准备实现meta programming的fold函数,发现自己缺少占位符实现,这样传入fold的transform op类(元函数)都不得不另外写个外覆类,其实我觉得没啥不好,简单直接,说实话干扰什么的没那么严重,一个功能块里能用fold的地方能有几次?但动了占位符这个念头,就想尝试实现一下。

看一下实际情景:

template
struct fold_s  {};

我们可能会希望把push_back作为运算子传入fold_s中,从而实现循环迭代TList的每一个元素,对其应用push_back。如:

using type = fold_s<>, nullist, push_back>::type;

问题是,push_back并不是一个类,只是一个声明,push_back如此才是一个真正的类,而一般只有类才能作为实参传入。

最直接的做法是写个外覆类:

c++11模拟boost元占位符placeholder

    struct push_back_wrap
    {
        template
        struct apply
        {
            using type = typename mpl::push_back::type;
        };
    };

c++11模拟boost元占位符placeholder

传入fold_s然后调用apply:

c++11模拟boost元占位符placeholder

    template
    struct fold_s
    {
        using sometype = typename TransformOp::apply::type;
    };

    using type = fold_s<>, nullist, push_back_wrap>::type;

c++11模拟boost元占位符placeholder

我们知道很多函数语言的一个特征就是延迟计算。此处push_back_wrap中的嵌套类apply,使得push_back_wrap也具有延迟的特性,类型计算直到fold_s真正应用apply时

才发生。这就是meta programming中实现lambada的手法。缺点是我们必须要在使用lambda元类的地方都默认假设apply存在。相比于它的强大功能,因为c++ mpl的

限制导致这个小不便,我们就忍忍吧。

相关图片

相关文章