公众号:张小飞那些事儿
15-特化与重载 15-特化与重载
重载模板以适用不同的情况 下面用于交换两个对象的函数模板exchange可以处理简单类型,但如果T是下面的类,就没必要再拷贝一次对象并调用两次赋值运算符,而只需要使用成员模板exchangeWith交换内部的指针 template<
14-模板实参推断 14-模板实参推断
推断的过程 每个实参-参数对的推断都是独立的,如果结果矛盾推断就会失败 template<typename T> const T& max(const T& a, const T& b) { return
13-实例化 13-实例化
On-Demand 实例化(隐式实例化) 编译器遇到模板特化时会用所给的实参替换对应的模板参数,从而产生特化 如果声明一个指向某类型的指针或引用,不需要看到类模板定义,但如果要访问特化的成员或想知道模板特化的大小,就要先看到模板定义 te
12-模板中的名称 12-模板中的名称
ADL(Argument-Dependent Lookup,Koenig Lookup) 下面例子解释了名称查找的基本规则 namespace A { struct X; struct Y; void f(int); void g(X);
11-深入模板基础 11-深入模板基础
参数化声明 C++现在支持四种原始模板:函数模板、类模板、C++14引入的变量模板(variable template)和别名模板(alias template) template<typename T> // 类模板 class
10-泛型库 10-泛型库
回调 回调的含义是:对一个库,用户希望库能够调用用户自定义的某些函数,这种调用称为回调。C++中用于回调的类型统称为函数对象类型,它们能直接用作函数实参 #include <iostream> #include <vector
09-模板实战 09-模板实战
链接错误 不同于一般代码的是,对模板使用头文件声明、源文件定义的组织方式,编译器会接受,但链接器会产生无法找到函数定义的错误 // basics/myfirst.hpp #ifndef MYFIRST_HPP #define MYFIR
08-编译期编程 08-编译期编程
C++有许多支持编译期编程的特性 C++98前,模板提供了编译期计算的能力,包括使用循环和执行路径选择 使用偏特化,可以在编译期根据特定的约束或要求,在不同的类模板实现之间进行选择 使用SFINAE,允许在不同的函数模板实现之间对不同的类
7-按值传递与按引用传递 7-按值传递与按引用传递
按值传递 按值传递实参时,原则上会拷贝每个实参,对于类通常还需要调用拷贝构造函数。调用拷贝构造函数可能开销很大,但事实上编译器可能对按值传递做优化,通过对复杂的对象使用移动语义避免高开销 template<typename T> v
6-移动语义与enable_if 6-移动语义与enable_if
完美转发(Perfect Forwarding) 要用一个函数将实参的如下基本属性转发给另一个函数 可修改的对象转发后应该仍可以被修改 常量对象应该作为只读对象转发 可移动的对象应该作为可移动对象转发 如果不使用模板实现这些功能,必须编
2 / 3