@@ -421,7 +421,7 @@ <h2 id="index-_1">前言</h2>
421421<blockquote>
422422<p><img src="../img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 本书还在持续更新中……要追番的话,可以在 <a href="https://github.com/parallel101/cppguidebook">GitHub</a> 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一封电子邮件,提醒你小彭老师更新了。</p>
423423</blockquote>
424- <p>更新时间:2024年10月26日 15:20:27 (UTC+08:00)</p>
424+ <p>更新时间:2024年10月31日 13:23:02 (UTC+08:00)</p>
425425<p><a href="https://parallel101.github.io/cppguidebook">在 GitHub Pages 浏览本书</a> | <a href="https://142857.red/book">在小彭老师自己维护的镜像上浏览本书</a></p>
426426<h2 id="index-_2">格式约定</h2>
427427<blockquote>
@@ -14334,16 +14334,74 @@ <h2 id="design_erasure-_2">虚函数的缺点</h2>
1433414334<p>TODO</p></section><section class="print-page" id="design_concept"><h1 id="design_concept-c20-concept">鸭子类型与 C++20 concept (未完工)</h1>
1433514335<div class="toc">
1433614336<ul>
14337- <li><a href="#design_concept-c20-concept">鸭子类型与 C++20 concept (未完工)</a><ul>
14338- <li><a href="#design_concept-_1">虚函数的缺点</a></li>
14339- <li><a href="#design_concept-_2">模板函数的缺点</a></li>
14340- </ul>
14341- </li>
14337+ <li><a href="#design_concept-c20-concept">鸭子类型与 C++20 concept (未完工)</a></li>
1434214338</ul>
1434314339</div>
14344- <h2 id="design_concept-_1">虚函数的缺点</h2>
14345- <p>TODO</p>
14346- <h2 id="design_concept-_2">模板函数的缺点</h2>
14340+ <p>如果一个东西叫起来像一只鸭,走起路来像一只鸭,那么不妨认为他就是一只鸭。</p>
14341+ <p>我们有三种类型的狗:拉布拉多犬,藏獒,张心欣。</p>
14342+ <blockquote>
14343+ <p><img src="../img/awesomeface.png" height="30px" width="auto" style="margin: 0; border: none"/> 请勿侮辱拉布拉多和藏獒!</p>
14344+ </blockquote>
14345+ <p>他们有一个共同点,那就是它们都会狗叫(bark)以及自我介绍(intro)。</p>
14346+ <pre><code class="language-cpp">struct Labrador {
14347+ void intro() {
14348+ puts("我能帮你捡回棍棍!");
14349+ }
14350+
14351+ void bark() {
14352+ puts("汪汪!");
14353+ }
14354+ };
14355+
14356+ struct Mastiff {
14357+ void intro() {
14358+ puts("我能保卫国王荣耀!");
14359+ }
14360+
14361+ void bark() {
14362+ puts("汪汪!");
14363+ }
14364+ };
14365+
14366+ struct Xinxin {
14367+ void intro() {
14368+ puts("我能祝您裁员滚滚!");
14369+ }
14370+
14371+ void bark() {
14372+ puts("从未贡献任何核心功能!");
14373+ }
14374+ };
14375+ </code></pre>
14376+ <p>现在,我们需要设计一个“饲养员”函数,他会让狗狗先自我介绍,然后叫两声。</p>
14377+ <p>传统的基于重载的写法,需要连续写三个一模一样的函数体,非常麻烦,违反“避免重复”原则,不利于代码未来的维护。</p>
14378+ <pre><code class="language-cpp">void feeder(Labrador dog) {
14379+ dog.intro();
14380+ dog.bark();
14381+ dog.bark();
14382+ }
14383+
14384+ void feeder(Mastiff dog) {
14385+ dog.intro();
14386+ dog.bark();
14387+ dog.bark();
14388+ }
14389+
14390+ void feeder(Xinxin dog) {
14391+ dog.intro();
14392+ dog.bark();
14393+ dog.bark();
14394+ }
14395+ </code></pre>
14396+ <p>方案1:模板函数</p>
14397+ <pre><code class="language-cpp">template <typename Dog>
14398+ void feeder(Dog dog) {
14399+ dog.intro();
14400+ dog.bark();
14401+ dog.bark();
14402+ }
14403+ </code></pre>
14404+ <p>此处把 <code>Dog</code> 定义为模板函数</p>
1434714405<p>TODO</p></section><section class="print-page" id="error_code"><h1 id="error_code-c">现代 C++ 错误处理知多少(未完工)</h1>
1434814406<p>配套视频:<a href="https://www.bilibili.com/video/BV1QpWSekEJY">BV1QpWSekEJY</a></p>
1434914407<div class="toc">
0 commit comments