关闭

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

发表于:2014-11-03 11:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:饭后温柔    来源:51Testing软件测试网采编

  准备实现meta programming的fold函数,发现自己缺少占位符实现,这样传入fold的transform op类(元函数)都不得不另外写个外覆类,其实我觉得没啥不好,简单直接,说实话干扰什么的没那么严重,一个功能块里能用fold的地方能有几次?但动了占位符这个念头,就想尝试实现一下。
  看一下实际情景:
  template<typename TList, typename Init, class TransformOp>
  struct fold_s  {};
  我们可能会希望把push_back作为运算子传入fold_s中,从而实现循环迭代TList的每一个元素,对其应用push_back。如:
  using type = fold_s<typelist<int, float, char>, nullist, push_back>::type;
  问题是,push_back并不是一个类,只是一个声明,push_back<somelist, t>如此才是一个真正的类,而一般只有类才能作为实参传入。
  最直接的做法是写个外覆类:
  struct push_back_wrap
  {
  template<typename TList, typename T>
  struct apply
  {
  using type = typename mpl::push_back<TList, T>::type;
  };
  };
  传入fold_s然后调用apply:
  template<typename TList, typename Init, class TransformOp>
  struct fold_s
  {
  using sometype = typename TransformOp::apply<TList, T>::type;
  };
  using type = fold_s<typelist<int, float, char>, nullist, push_back_wrap>::type;
  我们知道很多函数语言的一个特征就是延迟计算。此处push_back_wrap中的嵌套类apply,使得push_back_wrap也具有延迟的特性,类型计算直到fold_s真正应用apply时才发生。这就是meta programming中实现lambada的手法。缺点是我们必须要在使用lambda元类的地方都默认假设apply存在。相比于它的强大功能,因为c++ mpl的限制导致这个小不便,我们就忍忍吧。
  以上说明了一个占位符将要应用的情境。下面就开始no zuo no die的处理吧。其实就是有些人不希望每次用flod_s时都要写个外覆类,他们希望当flod_s需要传入push_back时就直接传入push_back,好看好记些。很明显那只能传入一个push_back的特化了。
  fold< vector<int, float, char>, vector<>, push_back<_1, _2> >::type;
  上边的_1,_2就是占位符了。push_back<_1, _2>就是我们所讨论的特化的。显然_1, _2是个类,在上述语句中分别指vector<>,int,总之占位符将指定你需要指定的位置。
  这个特化既然取代了外覆类,那它必然提供了相似的功能。也就是push_back必然是个类型延迟的元函数类,它具有类似下面的结构:
  struct push_back<...>
  {
  struct apply
  {
  type...
  };
  };
31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号