<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Templates on John Chen's blog</title><link>https://andy1314chen.github.io/tags/templates/</link><description>Recent content in Templates on John Chen's blog</description><generator>Hugo</generator><language>zh-cn</language><copyright>转载请注明出处</copyright><lastBuildDate>Fri, 08 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://andy1314chen.github.io/tags/templates/index.xml" rel="self" type="application/rss+xml"/><item><title>llama-cpp 源码学习: C++ 模板详解</title><link>https://andy1314chen.github.io/posts/2026/05/llama-cpp-%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0-c-%E6%A8%A1%E6%9D%BF%E8%AF%A6%E8%A7%A3/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>https://andy1314chen.github.io/posts/2026/05/llama-cpp-%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0-c-%E6%A8%A1%E6%9D%BF%E8%AF%A6%E8%A7%A3/</guid><description>&lt;h2 id="1-为什么需要模板"&gt;1. 为什么需要模板&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心问题&lt;/strong&gt;：一份逻辑，多种类型——不想为每种类型写一遍。&lt;/p&gt;
&lt;h3 id="11-c-的做法宏"&gt;1.1 C 的做法：宏&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MAX(a, b) ((a) &amp;gt; (b) ? (a) : (b))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MAX&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 对 int 用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MAX&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5.0f&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 对 float 用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;宏是纯文本替换——没有类型检查、括号地狱、调试困难。&lt;/p&gt;
&lt;h3 id="12-c-的做法模板"&gt;1.2 C++ 的做法：模板&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;template&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;T max(T a, T b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; a &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; b &lt;span style="color:#f92672"&gt;?&lt;/span&gt; a : b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; max(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 编译器自动生成 max&amp;lt;int&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; max(&lt;span style="color:#ae81ff"&gt;3.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5.0f&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 编译器自动生成 max&amp;lt;float&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译器遇到 &lt;code&gt;max(3, 5)&lt;/code&gt; 时，自动生成一份 &lt;code&gt;T = int&lt;/code&gt; 的版本——等价于你手写了 &lt;code&gt;int max(int a, int b)&lt;/code&gt;。这个过程叫&lt;strong&gt;模板实例化&lt;/strong&gt;，发生在编译期，零运行时开销。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：模板是&amp;quot;函数制作机&amp;quot;——你给配方，编译器按需生产具体类型的版本。&lt;/p&gt;</description></item></channel></rss>