公众号:张小飞那些事儿
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) 要用一个函数将实参的如下基本属性转发给另一个函数 可修改的对象转发后应该仍可以被修改 常量对象应该作为只读对象转发 可移动的对象应该作为可移动对象转发 如果不使用模板实现这些功能,必须编
5-Tricky Basic 5-Tricky Basic
typename前缀 C++默认用::访问的名称不是类,因此必须加上typename前缀,告诉编译器该名字是一个类型,否则会报错 template<typename T> void print(const T& c) {
4-可变参数模板 4-可变参数模板
可变参数模板示例void print() {} // 没有参数时将调用此函数 template<typename T, typename... Types> void print(T firstArg, Types... args)
3-非类型模板参数 3-非类型模板参数
非类型的类模板参数template<typename T, std::size_t Maxsize> class Stack { public: Stack(); void push(const T&); voi
2-类模板 2-类模板
类模板示例template<typename T> class Stack { public: Stack(); Stack(const Stack<T>&); // T是同一类型的类模板才能拷贝 Stac
2 / 68