我们的最终目标是在模板实例化的位置上捕捉并指出违反概念的错误。正如D&E[2]所指出的,可以通过在函数模板上测试所有要求来捕获错误。实际上如何测试要求(特定的有效表达式)是一件微妙的事情,因为我们希望代码被编译 --- 但不执行。我们的方法是在一个单独的函数中测试这些要求,这个函数被赋值给一个函数指针。这种情形下,编译器将实例化这个函数,但不会真正调用它。此外,一个优化的编译器还会将指针赋值作为"死代码"而删掉(虽然这个赋值操作在运行期的代价是非常微不足道的)。你可能会想编译器会不会一开始就跳过语义分析和约束函数的编译,从而使我们的函数指针技术不起作用。这是不可能的,由于删除无用代码和函数是编译器最后一步的工作。我们已经在 GNU C++, Microsoft Visual C++, 和多个基于 EDG 的编译器(KAI C++, SGI MIPSpro)上验证了函数指针的技术。以下代码示范了如何把这种技术应用于 std::stable_sort() 函数:

template <class RandomAccessIterator>
  void stable_sort_constraints(RandomAccessIterator i)
  {
typename std::iterator_traits<RandomAccessIterator>
      ::difference_type n;
    i += n;  // 检查 RandomAccessIterator 的要求
    ...
  }
  template <class RandomAccessIterator>
  void stable_sort(RandomAccessIterator first, RandomAccessIterator last)
  {
    typedef void (*fptr_type)(RandomAccessIterator);
    fptr_type x = &stable_sort_constraints;
    ...
  }

通常会有一大堆要求需要检查,对于程序库的作者来说,为每一个公有函数编写象 stable_sort_constraints() 一样的约束函数是一件很烦琐的事情。为此,我们按照相应的概念的定义,将一组有效表达式集合起来。对于每个概念,定义一个概念检查类模板,以要检查的类型作为模板参数。这些类含有一个 contraints() 成员函数,负责测试概念所要求的所有有效表达式。约束函数中使用到的对象,如 ni, 则声明为概念检查类的数据成员。

template <class Iter>
  struct RandomAccessIteratorConcept
  {
    void constraints()
    {
      i += n;
      ...
    }
    typename std::iterator_traits<RandomAccessIterator>
      ::difference_type n;
    Iter i;
    ...
  };

我们还可以用这种函数指针机制来引起约束函数的实例化,只不过现在换成了成员函数指针。为了库更加易于执行概念检查,我们将成员函数指针机制包装在一个名为 function_requires() 的函数中。以下代码片断示范了如何使用 function_requires() 来确认迭代器是一个 RandomAccessIterator随机迭代器。

template <class Iter>
  void stable_sort(Iter first, Iter last)
  {
    function_requires< RandomAccessIteratorConcept<Iter> >();
    ...
  }

function_requires() 的定义如下。其中 Concept 为已实例化的概念检查类。我们将约束成员函数的地址赋值给函数指针 x, 这将引起约束函数的实例化,并检查概念的有效表达式。然后我们通过将 x 赋值给 x 来避免编译器的无用变量警告,并将这些都包装在一个 do-while 循环中以防止名字冲突。

template <class Concept>
  void function_requires()
  {
    void (Concept::*x)() = BOOST_FPTR Concept::constraints;
    ignore_unused_variable_warning(x);
  }

c++概念模型的官方解释相关推荐

  1. c语言指针官方解释_C语言中的指针解释了–它们并不像您想象的那么难

    c语言指针官方解释 Pointers are arguably the most difficult feature of C to understand. But, they are one of ...

  2. 关于eMule下载伤硬盘的话题(官方解释)

    关于eMule下载伤硬盘的话题(官方解释) 官方解释: 先说一下现代硬盘的工作原理 现在的硬盘,无论是IDE还是SCSI,采用的都是"温彻思特"技术,都有以下特点:1.磁头,盘片及 ...

  3. Oracle中V$SESSION等各表的字段解释,Oracle官方解释

    https://www.cnblogs.com/grey-wolf/p/10119219.html Oracle中V$SESSION等各表的字段解释,Oracle官方解释 阅读目录 一.常用的视图 1 ...

  4. 皮卡丘为什么不进化_为什么神奇宝贝唯独皮卡丘没进化过?网友:看官方解释,竟无言以对!...

    原标题:为什么神奇宝贝唯独皮卡丘没进化过?网友:看官方解释,竟无言以对! 说实话,我已经好久没有看过神奇宝贝系列动漫了,从最开始的神奇宝贝到宠物小精灵,再到如今的精灵宝可梦,连作品名字都是一波三折,现 ...

  5. 绝地求生为何显示服务器上限,绝地求生服务器为啥不给力?官方解释:人太多了...

    绝地求生大逃杀是当下最火的生存竞技游戏了,可是最近<绝地求生>玩家们讨论更多的不是如何吃鸡,而是<绝地求生>的服务器究竟如何不给力.那么绝地求生服务器为什么不给力?下面就来听听 ...

  6. 小米5s升级android8.0,小米官方解释了5S不能升安卓8.0的原因:高通不升级

    不知道有多少米粉在期待MIUI10的到来. 确实,这次的MIUI10无论是从界面的改变还是底层创新功能的推出,都俘获了一大批米粉们的心. 第一批的MIUI10推送机型早已公布,而如今第二批适配机型也马 ...

  7. 好慌!支付宝App现“不锈钢内裤” 官方解释:已改为“煮内裤的锅”

    今天轮到支付宝翻车了,尴尬中带了点好笑. 今天,有网友发现支付宝App的每日必抢栏目出现了名为"不锈钢内裤"的产品,这还真是看得有点让人懵圈的. 随后这名网友就@支付宝,调侃了一下 ...

  8. torch.cat()函数的官方解释,详解以及例子

    可以直接看最下面的例子,再回头看前面的解释,就很明白了. 在pytorch中,常见的拼接函数主要是两个,分别是: stack() cat() 一般torch.cat()是为了把多个tensor进行拼接 ...

  9. glc四驱软件测试,新款奔驰GLC四驱无法脱困,奔驰官方解释“亮”了

    奔驰作为一线豪华品牌,理应用良好的品质及稳定的质量让消费者信赖.但近年来,奔驰在中国市场却被频频曝出质量问题,仅2019年奔驰在华召回数量高达145万辆,是其当年销量的两倍.同时,奔驰也成为了2019 ...

最新文章

  1. [推荐]Angular File Changer (Supporting Touch Bar and NgRx)→用于快速切换同名HTML/SCSS/TS文件,非常的实用
  2. 找java培训机构有哪些参考标准
  3. CentOS7 64位下MySQL5.7安装与配置(YUM)
  4. [STL]List的实现
  5. 论文浅尝 - WWW2020 | 生成多跳推理问题以改善机器阅读理解能力
  6. php文件上传到虚拟主机,php源码上传到虚拟主机(php源码上传到服务器)
  7. train_val.prototxt文件和deploy.prototxt文件开头的区别
  8. Spring中为什么要开启注解扫描
  9. idea使用数据库连接工具
  10. 基于ConfuserEx的混淆加壳
  11. android自定义控件(组合控件)相关
  12. 全宇宙最深入的CSS3 姬成 渡一学习记录
  13. 哪个蓝牙耳机好?盘点2022年600元左右的蓝牙耳机
  14. 混合式学习,以学习者为中心的新型教学形式
  15. MySQL中B+树索引,聚簇索引,二级索引,辅助索引,回表,索引生效条件
  16. 19 分布式缓存集群的伸缩性设计
  17. SpringBoot修改启动图标(详细步骤)
  18. 微信小程序踩坑–卸载所有页面(含tabBar)跳转到指定页面
  19. 「Python条件结构」显示学号及提示信息
  20. C++ 网络爬虫 之 自动获取小米笔记本的最新驱动信息

热门文章

  1. mysql分页的优势_数据库经典分页几种实例及各优缺点
  2. oracle asm clsecho,ASM磁盘组一点管理
  3. php 线条的绘制,在非常高的图像上使用PHP绘制线条,脚本停止绘制.怎么了,怎么解决?...
  4. python reader循环_python – 多次循环遍历csv.DictReader行
  5. python三维图的坐标_六维图见过么?Python 画出来了
  6. Eslint配置文件 `.eslintrc.js`
  7. UOJ46. 【清华集训2014】玄学
  8. python运算符和表达式
  9. 【Unity/Kinect】获取预制的手势信息KinectInterop.HandState
  10. 鼠标样式(cursor)