File tree Expand file tree Collapse file tree 1 file changed +48
-0
lines changed
Expand file tree Collapse file tree 1 file changed +48
-0
lines changed Original file line number Diff line number Diff 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+ *有点看不懂,我去补一下模板和泛型再回来看这本书。*
You can’t perform that action at this time.
0 commit comments