Skip to content

Commit 75e5768

Browse files
committed
Update public notes
1 parent 1c6246e commit 75e5768

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

content/编程相关/编程语言/Cpp 之旅 第三版 读书笔记.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,3 +600,51 @@ constexpr complex<double> operator""i(long double arg) {
600600

601601
## 第7章 模板
602602

603+
> **模板是一个类或者一个函数,我们用一组类型或值对其参数化。我们使用模板表示那些通用的概念,然后通过指定参数生成特定的类型或函数。**
604+
605+
*跟泛型有点像,写粗略了。*
606+
607+
用 `template<typename T>` 在 class 声明前面就能使用模板。
608+
609+
`typename T``class T` 意思都一样,`class T` 主要是来自于旧式代码。
610+
611+
### 参数化类型
612+
613+
#### 受限模板参数
614+
615+
可以用 C++20 的 **概念** 来对模板参数进行限制。
616+
617+
概念检查纯粹在编译时进行。
618+
619+
> C++在C++20标准之前并没有官方支持概念,所以旧有代码只能使用受限模板参数,并且把受限需求写在文档中。然而,从模板生成的代码同样包含了类型检查,即便是受限模板的代码也和手写代码一样类型安全。
620+
621+
#### 模板值参数
622+
623+
就是用具体的值当模板参数。
624+
625+
例如:`template<typename T, int N>`
626+
627+
> **不幸的是,因为隐晦的技术原因,字符串字面量不可以作为模板值参数。但在某些场合,使用字符串值作为参数又非常重要。因而,我们可以使用存放字符的数组来表示字符串:**
628+
629+
*无力吐槽。*
630+
631+
> 在C++中,通常会有间接的解决方案:不需要对所有情况提供直接支持。
632+
633+
*吐槽被预判了。。。*
634+
635+
### 模板参数推导
636+
637+
模板参数会自动推导。
638+
639+
当初始化列表的类型不一致时编译器会报出二义性错误。
640+
641+
*不过不是很理解干嘛喜欢隐式模板参数,显式指定大部分情况都表现足够良好。*
642+
643+
如果要解决二义性问题可以用 **推导指引** 。
644+
645+
```cpp
646+
template<typename Iter>
647+
Vector(Iter,Iter) -> Vector<typename Iter::value_type>
648+
```
649+
650+
*有点看不懂,我去补一下模板和泛型再回来看这本书。*

0 commit comments

Comments
 (0)