`
daojin
  • 浏览: 680115 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

c++概念模型的官方解释

阅读更多

我们的最终目标是在模板实例化的位置上捕捉并指出违反概念的错误。正如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++对象模型详解[收集].pdf

    然后,文章讨论了C++对象模型的基本概念,包括类布局、成员变量和成员函数的访问、虚继承、虚函数调用等。 在类布局部分,文章讨论了不同的继承方式对内存布局的影响,包括单继承、多重继承和虚继承。在C结构...

    C++对象内存模型.pdf

    C++ 对象内存模型是 C++ 编程语言中一个重要的概念, 它描述了 C++ 对象在内存中的存储结构。这个模型是 C++ 编程语言的基础之一,对于理解 C++ 编程语言的工作机理具有重要的意义。 在 C++ 中,对象的内存模型是...

    c++的并发模型

    这个是关于c++的几种并发模型,主要在于并发的概念和思想。

    C++常用数据结构.rar

    常用数据结构(线性表、各类链表、散列表、栈和队列、树形结构、图型结构)的C++模板类方式实现, linux环境中通过编译测试(包含makefile和vscode工程文件) 仅供参考和交流学习,欢迎批评指正~

    C++面向对象高效编程

    第二部分说明了如何建立抽象的概念及其策略,并研究了C++对象模型。书中带有大量的代码实例,使读者不仅能够从理论上得以提高,而且还能够轻松地在实践中应用。。。 本书适用于C++程序员,也可供对面向对象程序设计...

    基于MFC的C++的select模型的TCP聊天室.zip

    基于MFC的C++的select模型的TCP聊天室 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象...

    C++面向对象高效编程(高清pdf扫描版)

    本书以帮助读者掌握C++面向对象高效编程方法为目的,详细...第二部分说明了如何建立抽象的概念及其策略,并研究了C++对象模型。书中带有大量的代码实例,使读者不仅能够从理论上得以提高,而且还能够轻松地在实践中应用

    C++教程网

    课程目标:掌握Linux系统编程技术,掌握文件、虚拟存储、进程等抽象概念。 实训主题:Linux系统编程之文件篇、Linux系统编程之进程篇、Linux系统编程之信号篇、Linux系统编程之管道篇。 实战项目:Minishell。 阶段...

    华为内部员工C++中级培训教材

    华为内部员工C++中级培训教材 ... 本课程主要是更进一步探讨一下C++一些基本模型的应用,加深对概念的理解,由于课程时间有限,C++,模型和内容又如此之多,对任何一个模型都无法深入进去,所以只能泛泛而谈。

    基于Reactor模型事件驱动C++服务器.zip

    基于Reactor模型事件驱动C++服务器C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程...

    本书以帮助读者掌握C++面向对象高效编程

    第二部分说明了如何建立抽象的概念及其策略,并研究了C++对象模型。书中带有大量的代码实例,使读者不仅能够从理论上得以提高,而且还能够轻松地在实践中应用。  本书适用于C++程序员,也可供对面向对象程序设计感...

    C与C++要点框图

    C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以...

    Visual C++数据库编程快速入门

    ODBC基本概念 ADO对象访问模型 ADO与ODBC的区别 MFC中相关类和ADO类库简介 CRecordSet类 CDatabase类 CRecordView类 VC++中调用ADO的常用方法 Visual C++数据库编程实战 VC++演示ODBC...

    C++标准的STL介绍

    从逻辑层次来看,在STL中体现了泛型化程序设计的思想,引入了诸多新的名词,比如像需求requirements,概念concept,模型model,容器container,算法algorithmn,迭代子iterator等。与OOPobject-oriented ...

    c++ primer中文版【第三版】 PDF电子书

    作者:Stanley B.Lippman,Josee Lajoie/著 ... 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。

    基于select模型的多人聊天程序(C++).zip

    学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新...

    Visual C++从初学到精通 吕兵 高清PDF带书签

    WinMain()函数、MFC消息映射机制、API文件操作、MFC文件操作、创建位图对象、模态对话框、菜单的创建、工具栏的使用、状态栏的创建、进程和线程的基本概念、Win32的进程处理、Win32的线程处理、MFC的线程处理、线程...

    C++程序设计原理与实践(中文带附录高清版).7z.007(共9个分卷)

    与传统的C++教材相比,本书对基本概念和技术的介绍更为深入,为你编写实用、正确、易维护和有效的代码打下坚实的基础。  ·强调现代C++编程风格。本书从开篇就介绍现代C++程序设计技术,并揭示了大量关于如何使用...

    matlab代码中向量的点乘-veristand-model-coder:VeristandC/C++模型代码生成器

    从概念上看,模型是用数学方程对真实事物的抽象和模拟。比如一个电机模型就是对真实电机模拟,它具有电机的特性:给定一个电压可以得到一定的转速,同时它又是抽象的,我们只关心需要的参数,而忽略不重要的参数,...

    第1章 初识C++语言(C++版).ppt

    本资源主要介绍了C++语言的基本概念和特点,以及C++语言程序的结构。下面是本资源的详细知识点: 一、C++语言概述 * C++语言是由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明的。 * C++...

Global site tag (gtag.js) - Google Analytics