C++学习笔记I
它真可爱。
本文仅供个人学习记录使用,其中大多文字逻辑不清,略有错误,望各位慎重阅读!
问题导向
1. 指针显示调用构造函数
这是不可能的,只能是
new Class(object);
2. std::tuple为什么能存类型?所谓的存类型又是什么?
-
- make_tuple是如何自动推导类型的,推导的时机是编译时还是运行时?
- make_tuple是如何做到接受任意个任意类型的?
- 既然tuple没有下标,那么其内部结构是怎样的?在逻辑空间上是连续存储还是离散存储呢?
- 如何静态地创建一个tuple对象并静态地获取其元素的值?
-
- 如何静态地获取tuple元素的类型?
-
- 想要进一步地使用好tuple,必须结合模板元编程
3. 模板必须要知道的东西
- 函数模板-实参可提供自动推导的信息
template <typename T>
void simple_swap(T& a,T&b)
{
T temp=a;
a=b;
b=temp;
}
int main(int argc, char* argv[])
{
double a=10;
double b=20;
simple_swap<double>(a,b);
simple_swap(a,b);
}
- 类模板有没有这样的设定呢?
C++17引入了CTAD(class template argument deduction)即类模板参数推导 - 对象尚未存在,对应类的constexper成员函数即可执行
- 类模板是类的生成器,函数模板是函数的生成器
- 为什么不能头源分离?模板的处理先于链接,类和函数的实现也限制了模板是否能“实例化”
4. 进阶:模板特化
-
模板匹配失败不是错误
用于类型特性检测,是否支持+,是否有某个函数成员等 -
函数模板全特化的匹配是否只是支持非构造的隐式转换?
关键在于静态分析阶段,编译器认为这将是一个什么类型。 -
函数模板-隐式类型转换给模板全特化带来的烦恼
- 平凡转换和调用构造函数的隐式转换的本质不同是?(汇编学的好,这个问题没烦恼)
- 部分字面量的类型较为模糊,如何确定?
比如10,是int?还是short?还是size_t? - 调用构造的隐式转换-(存疑)为什么模板特化不做,函数重载却做了
-
const
- 如何同时特化const int和int?
- 重载能区分到多细?函数模板全特化能区分到多细?
-
类模板全特化
- 以template<>为全特化标志,同时以完整声明指明特化类型
- 特化后的类是一个全新的类,与通用模板的类产生器产生的类没有联系
-
偏特化
- 偏特化使用的参数数量要少于或等于通用模板参数的数量?
-
原始数组之间的赋值为指针,而不是copy
-
坑爹的typename=void,如何理解带默认值的匿名模板参数?
- enable_if<>
- is_addable<>
- std::void_t<>
5. 整合tuple与模板特化
-
std::tuple 是编译期异构容器,元素类型 / 数量由模板参数决定
-
编译期拆解tuple,获得所有类型
- 模板递归
-
模板匹配时,由于函数实现导致的异常在编译时被发现还是在运行时被发现?
-
模板递归
- 本身与...无显示关联,只是自己的函数调用自身而已,再结合每次调用传参会变化,调用一次,编译器就会根据类生成器生成一个类,而生成的匹配规则又有特化这一点,所以只需要特化终止值即可,再使得终止类和非终止类的同一个函数的实现不同即可实现终止。
- 那么该怎么终止呢?——停止调用就行
https://www.doubao.com/thread/wa45b930bea912c15
-
坑爹的静态变量初始化不递归
- C++不保证静态成员变量初始化顺序
-
类成员函数的模板
- iterator到底是什么,内部结构如何?

浙公网安备 33010602011771号