问题:如何侦知任意型别 T 是否可以自动转换为型别 U? 方案:侦测转换能力的想法:合并运用 sizeof 和重载函数. 1 依赖 sizeof,sizeof 有着惊人的能力,你可以把 sizeof  用在任何表达式身上,不论后者有多复杂.sizeof 会直接传回大小,不需拖到执行期才评估.这意味着 sizeof 可以感知重载 (overloading).模板具现(template instantiation).转换规则(conversion rules).或任何可发生于C++ 表达式身上的机制…
1.置入式模型 链接错误: 大多数非模板程序代码的组织如下:A,类声明在头文件中: B:全局变量和非inline函数在cpp文件中定义 但是,如果模板程序也这样组织,则会出错.原因在于:函数模板的定义没有被实体化.为了实例化一个模板,编译器必须知道以哪一份定义以及哪些参数对其进行实例化.如果把声明放在h文件,定义放在cpp文件,这编译器无法知道这些信息.因此当编译器发现调用该函数模板时,无法找到其定义,无法以具体的数据类型来实体化该模板函数.于是编译器假设该函数模板的定义位于其他某处,因而只生成…
今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢. 一.类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写在类声明中,那么可以跳过该部分. 请看下面这段代码: 头文件: #pragma once template<typename T> class CLA { T m_value; public: CLA(const T&); friend CLA operator+(const CLA&am…
一.内联函数     常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址.执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处.来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销.     有了内联函数,编译器使用相应的函数代码替换…
一.基本说明 C++标准中提到,一个编译单元是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有PE[PortableExecutable,即Windows可执行文件]文件格式,并且本身包含的就已经是二进制码,但是,不一定能够执行,因为并不保证其中一定有main函数.当编译器将一个工程里的所有.cpp文件以分离的方式编译完毕后,再由连接器(linker)进行连接成为一个.exe文件.…
C++ templates的最初发展动机很直接:让我们得以建立“类型安全”的容器如vector,list和map.然而当愈多人用上templates,他们发现templates有能力完成愈多可能的变化.容器当然很好,但泛型编程——写出的代码和其所处理的对象类型彼此独立——更好.STL算法如for_each, find 和 merge 就是这一类编程的成果.最终人们发现,C++ template机制自身是一部完整的图灵机:它可以被用来计算任何可计算的值.于是导出了模板元编程,创造出“在C++编译器…
c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂. 我在5年前开始使用模板,那时我看到了MFC的容器类.直到去年我还没有必要自己编写模板类.可是在我需要自己编写模板类时,我首先遇到的事实却是“传统”编程方法(在*.h文件声明,在*.cpp文件中定义)不能用…
源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 PM 发表人: Nemanja Trifunovic 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂. 我在5年前开…
c++模板类 分类: C++2012-08-20 21:28 7108人阅读 评论(2) 收藏 举报 c++编译器instantiationiostreamlinker编程 c++模板类 分类: 数据结构2010-04-02 11:40 152人阅读 评论(0) 收藏 举报 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boo…
0 缘起 有一点编程经验和积累,想系统的学习下STL,以前都是随意做的笔记,现在想着成主题的输出一下. 书的原型是ISBN:9787302421757 <C++泛型STL原理和应用>,是从图书馆借的国内大学教材,先把这个读完了,如果有可能的话,就在相应的章节再写一个plus版本. 1 内容 1.1 泛型和模板 1.1.1 泛型的概念 泛型(generic type):就是一种通用类型. T max( T x, T y) {} //这里T是类型占位符. 1.1.2 C++模板及其定义 模板:除了…
源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 PM 发表人: Nemanja Trifunovic 前言 常遇到询问使用模板到底是否容易的问题,我的回答是:"模板的使用是容易的,但组织编写却不容易".看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂.…
第1章:C++泛型技术基础:模板 1.2 关于模板参数 1.2.1 模板参数类型 类型参数   typename声明的参数都属于类型参数,它的实参必须为系统内置或者用户自定义的数据类型,包括类模板实体,由类模板产生的类模板实体,本质上就是类. 非类型参数   C++允许人们在模板参数列表中像函数参数列表中那样定义普通变量或者对象.定义的普通变量不能被修改,因为模板参数是在预编译期间进行传递并且被编译的.仅支持可以转换为Int类型的变量(double都不行!).枚举.指针.引用. template…
转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. Rvalue reference and move semantics 右值引用与转移语义 在标准C++语言中,临时量(术语为右值,因其出现在赋值表达式的右边)可以被传给函数,但只能被接受为const &类型.这样函数便无法区分传给const &的是真实的右值还是常规变量.而且,由于类型为co…
一.让自己习惯C++ 条款01:视C++为一个语言联邦 C++可视为: C:以C为基础. 面向对象的C++:添加面向对象特性. 模板C++:泛型编程概念,使用模板. STL:使用STL的容器.迭代器.算法.及函数对象. 四者的集合. 条款02:尽量以const,enum,inline替换#define 对于单纯常量,尽量以const对象或enums枚举来代替#define. 若用 define 的可能会导致程序出出现多份目标码,而常量不会出现这种情况 取一enum的地址就不合法,这种行为和 de…
前言 今日的C++不再是个单纯的"带类的C"语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分.在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态:在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态.在本文中,我们将了解: 什么是运行期多态 什么是编译期多态 它们的优缺点在哪 运行期多态 运行期多态的设计思想要归结到类继…
1.  视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 2.  尽量以const,enum.inline替代#define 1) 对于单纯常量,最好以const对象或enum替换#define 2) 对于形似函数的宏.最好改用inline函数替换#define 3)宁能够编译器替换预处理器 4)用define定义的名称并没有进入符号表.无法对其进行跟踪 3.  尽可能使用const 1)假设keywordconst出如今星号左边.表示被指物是常量:右边,指…
C++中的静态多态和动态多态 今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming)的语言. 这些能力和弹性使C++成为一个无可匹敌的工具,但也可能引发使用者的某些迷惑,比如多态.在这几种编程泛型中,面向对象编程.泛型编程以及很新的元编程形式都…
条款四十六:需要类型转换时请为模板定义非成员函数 条款四十七:请使用traits classes 表现类型信息 1.整合重载技术后,traits classes 有可能在编译期对类型执行if...else测试. 2.STL共有五种迭代器分类 1)Input迭代器只能向前移动一次一步,客户只可读取(不能涂写)它们所指的东西,而且只能读取一次.(模仿指向输入文件的阅读指针) 2)Output迭代器一切只为输出,它们只向前移动,一次一步,客户只可涂写它们所指的东西,而且只能涂写一次.   3)forw…
如今的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming)的语言. 这些能力和弹性使C++成为一个无可匹敌的工具,但也可能引发使用者的某些迷惑,比如多态.在这几种编程泛型中,面向对象编程.泛型编程以及很新的元编程形式都支持多态的概念,但又有所不同.…
条款1:视C++为一个语言联邦:C.Object-Oriented C++.Template C++.STLC++高效编程守则视情况而变化,取决于使用C++的哪一个部分 条款2:尽量以const,enum,inline替换#define1.对于单纯的常量,最好以const对象或enums替代#define2.对于形似函数的宏,最好用inline函数替代#define 条款3:尽可能使用const3.尽量使用const,将某些东西声明为const可以帮助编译器侦测出错误的用法.const可被施加与…
Effective C++ Iter 3 - 尽可能使用 const 一个反逻辑的 bitwise const class Text { ... char& operator[](std::size_t pos) const { return text[pos]; } private: char *text; }; . 在 clang 3.8 上编译失败,编译器已经修复这个反逻辑的问题.const 成员函数只能返回 const char& 类型的变量,这就保证了对象不能被修改. 当存在 c…
There's an interesting issue one has to consider when mixing function overloading with templates in C++. The problem with templates is that they are usually overly inclusive, and when mixed with overloading, the result may be surprising: 因为模板的包容性太强,因…
07:在创建对象时注意区分()和{} 自C++11以来,指定初始化值的的方式包括使用小括号,等号,以及大括号: ); // initializer is in parentheses ; // initializer follows "=" }; // initializer is in braces }; // initializer uses "=" and braces C++将后两种使用大括号的两种方式视为相同的方式. C++11之前,单纯的直接初始化和复制…
[前言]二者的区别就不介绍了.二者使用方法: printf("%s",a); cout<<a<<endl; endl的作用是什么? 一.endl作用 众所周知,endl有一个换行的作用,第二个作用就是清空缓冲区buffer. 为什么要清空缓冲区呢? 首先思考缓冲区存在的作用,缓冲区的作用一是为了避免频繁的I/O操作对磁盘的损耗,二是减少存取时的函数调用的损耗.所以,c++里面的缓冲区意义是非常大的,注意printf是没有缓冲区的. 我们上面即使没有加上endl,…
七.模板与泛型编程 41.了解隐式接口和编译器多态 1.类和模板都支持接口和多态. 2.类的接口是显式定义的--函数签名.多态是通过虚函数在运行期体现的. 3.模板的接口是隐式的(由模板函数的实现代码所决定其模板对象需要支持哪些接口),多态通过模板具现化和函数重载解析在编译期体现,也就是编译期就可以赋予不同的对象于模板函数. 42.了解typename的双重意义 1.声明模板参数时,前缀关键字class和typename可以互换. 2.请使用关键字typename标识嵌套从属类型名称:1(表明后…
STL有字符串处理类——stirng和wstring,但是用的时候会觉得不是很方便,因为它不能像TCHAR一样根据定义的宏在char类型字符串和wchar_t进行转换,总不能因为程序要Unicode就把所有类型转换一遍吧?有没有好办法? 答案当然是肯定的,先看看MS的TCHAR是怎么做的,以下摘自MS Platform 的tchar.h,略有删减 #ifdef _UNICODE#ifdef __cplusplus } /* ... extern "C" */ #endif/* ++++…
Item4 确保对象被使用前进行初始化 C++在对象的初始化上是变化无常的,例如看下面的例子: Int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: Class Point { Int x,y; }; Point p; P的数据成员有时候保证能够被初始化(成0),有时候却不能.如果你从不存在未初始化对象的语言中转到c++, 就需要注意了,因为这很重要. 使用未初始化对象的坏处 读取未初始化的值会产生未定义的行为.在一些平台中,仅仅读取未初始化的值就会让…
C++在对象的初始化上是变化无常的,例如看下面的例子: int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: class Point { int x,y; }; Point p; P的数据成员有时候保证能够被初始化(成0),有时候却不能.如果你从不存在未初始化对象的语言中转到c++, 就需要注意了,因为这很重要. 1. 使用未初始化对象的坏处 读取未初始化的值会产生未定义的行为.在一些平台中,仅仅读取未初始化的值就会让你的程序停止.更有可能读入一些半随…
DWARF调试格式的简介 Michael J. Eager, Eager Consulting Feb, 2007 翻译:吴晖 2012年2月 如果我们可以编写确保能正确工作且永远不需要调试的程序,这将非常美妙.在梦想成真之前,通常的编程周期还将是包括:编写一个程序,编译它,执行它,然后可怕的.灾难般的调试.然后重复以上步骤,直到程序如期工作. 通过插入打印各种感兴趣变量的值的代码来调试程序是可能的.事实上,在某些情形里,比如调试内核驱动,这可能是最好的方法.存在有允许你一条接一条指令单步执行可…
前言 函数重载在C++中是一个很重要的特性.之所以有了它才有了操作符重载.iostream.函数子.函数适配器.智能指针等非常有用的东西. 平常在实际的应用中多半要么是模板函数与模板函数重载,或者是非模板函数与非模板重载.而让模板函数与非模板函数重载的情况却很少. 前段时间在项目中偶然遇到了一个模板函数与非模板函数重载的诡异问题,大概相当于下面这种情况: template <typename T> int compare(const T& lhs, const T& rhs)…