<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Sunrisepeak&#x27;s Blog]]></title><description><![CDATA[Sunrisepeak的博客]]></description><link>http://forum.d2learn.org/category/11</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 22:17:25 GMT</lastBuildDate><atom:link href="http://forum.d2learn.org/category/11.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Dec 2025 10:16:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[现代C++泛型编程初识 - 类模板到模板特例化及具体应用示例]]></title><description><![CDATA[<h2>文章导读</h2>
<ul>
<li>一、类模板与模板特化(全特化与偏特化)</li>
<li>二、类模板与其模板特化的应用</li>
<li>三、模板特化存在性问题</li>
</ul>
<h2>一、类模板与模板特化(全特化与偏特化)</h2>
<blockquote>
<p dir="auto">从接受类型的角度<br />
类模板：全集R<br />
模板偏特化(部分特化)：为全集的一个子集A<br />
模板全特化：为R中的一个"点"，或者说为R中的一个元素<br />
匹配规则：越特化匹配优先级越高(见下面例子)</p>
</blockquote>
<p dir="auto"><img src="/assets/uploads/files/1765188484753-98a9da6a-01af-4fc4-83ad-91b7ca549699-image.png" alt="98a9da6a-01af-4fc4-83ad-91b7ca549699-image.png" class=" img-fluid img-markdown" /></p>
<h3>1.类模板</h3>
<blockquote>
<p dir="auto">可以接受任意类型</p>
</blockquote>
<pre><code>// R
template&lt;typename T&gt;
class A {};    // 类模板是能接受任意类型，A后面不需要(不能)任何处理
</code></pre>
<h3>2.模板偏特化(局部特化)</h3>
<blockquote>
<p dir="auto">可以接受任意指针类型</p>
</blockquote>
<pre><code>// A
template&lt;typename T&gt;
class A&lt;T *&gt; {};    // 类模板A的偏特化版本，在A后指出特化的范围
</code></pre>
<h3>3.模板全特化</h3>
<blockquote>
<p dir="auto">指定接受int类型</p>
</blockquote>
<pre><code>template&lt;&gt;
class A&lt;int&gt; {}    // 类模板A的全特化版本(已经是类模板的一个实例了)，在A后直接指出明确类型int
</code></pre>
<h3>4.例子：</h3>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

template&lt;typename T&gt;
class A {
public:
    A() {
	cout &lt;&lt; "R" &lt;&lt; endl;
    }
};

/* 注释1　－－　接受指针
template&lt;typename T&gt;
class A&lt;T *&gt; {
public:
    A() {
	cout &lt;&lt; "A" &lt;&lt; endl;
    }
};
*/

/* 注释2　－－　接受int
template&lt;&gt;
class A&lt;int&gt; {
public:
    A() {
	cout &lt;&lt; "int" &lt;&lt; endl;
    }
};
*/

int main() {
    A&lt;string&gt; r;    // 1
    A&lt;char *&gt; a;    // 2
    A&lt;int&gt; i;       // 3
    return 0;
}
</code></pre>
<h3>5.测试不同情况:</h3>
<blockquote>
<p dir="auto">当只有一个类模板(可接受任意类型R)存在时，1, ２,  3都使用类模板实例化</p>
</blockquote>
<p dir="auto"><img src="/assets/uploads/files/1765188632617-v2-a53836d6d2a913d69c2fd90b0dd4371f_1440w.png" alt="v2-a53836d6d2a913d69c2fd90b0dd4371f_1440w.png" class=" img-fluid img-markdown" /></p>
<blockquote>
<p dir="auto">注释１是接受所以指针类型(R的子集A),所以称其为类模板A的偏特化(范围特化)。即把类模版A所能接受的指针类型单独处理(实例化)。当取消注释１时：char * 将由这个模板类A的偏特化版本(范围特化，局部特化)处理。</p>
</blockquote>
<p dir="auto"><img src="/assets/uploads/files/1765188640018-v2-2bd02b7f6a4dbb5cdbc586f98d76b92b_1440w.png" alt="v2-2bd02b7f6a4dbb5cdbc586f98d76b92b_1440w.png" class=" img-fluid img-markdown" /></p>
<blockquote>
<p dir="auto">注释２只接受int类型的参数(可以看出是全局R中的一个元素)。当你用int实例化A时，将会由这个全特化版本来实现(而不会使用可以接受任意类型的版本(泛化版))。</p>
</blockquote>
<p dir="auto"><img src="/assets/uploads/files/1765188702892-v2-6a08120bfe6da8471d8fb374b2665a65_1440w.png" alt="v2-6a08120bfe6da8471d8fb374b2665a65_1440w.png" class=" img-fluid img-markdown" /></p>
<h2>二、类模板与其模板特化的应用</h2>
<pre><code>用模板的偏特化　实现一个　能移除任意类型const属性的模板类：remove_const
主要功能和用法：
功能：
给remove_const一个类型后
－－１．(情况１)如果这个类型没有const属性则获得这个类型本身。
－－２．(情况２)如果这个类型有const属性则移除它。
用法：
remove_const&lt;Type&gt;::type
使用场景：
当拿到一个未知变量时，想获得这个变量(或对象)的非const的类型
</code></pre>
<h3>1.实现情况１</h3>
<blockquote>
<p dir="auto">似乎没做什么事，aa是int符合情况１。但情况２不符合，bb没有变成int。</p>
</blockquote>
<pre><code>#include &lt;iostream&gt;
#include &lt;type_traits&gt;

template&lt;typename T&gt;
struct remove_const {
    using type = T;
};


int main() {
    int a = 1;
    const int b = 2;
    remove_const&lt;decltype(a)&gt;::type aa = 3;
    remove_const&lt;decltype(b)&gt;::type bb = 4;
    std::cout &lt;&lt; std::is_same&lt;decltype(aa), int&gt;::value &lt;&lt; std::endl;
    std::cout &lt;&lt; std::is_same&lt;decltype(bb), int&gt;::value &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p dir="auto">运行结果:<br />
<img src="/assets/uploads/files/1765188812524-v2-7a36de2df8473699ecc173f27351c876_1440w.png" alt="v2-7a36de2df8473699ecc173f27351c876_1440w.png" class=" img-fluid img-markdown" /></p>
<h3>2.实现情况2</h3>
<p dir="auto">从上面的实现可以看出，当传给模板的参数是带const类型时它还会返回带const属性的类型。同时从remove_const的定义也可以看出他是个　复读机　你给他什么类型他就给你什么类型。</p>
<p dir="auto">这时候可以使用上面介绍的偏特化的性质，来把带有带const的类型这个子集从全集中分离出来　特殊处理。如下：</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;type_traits&gt;

template&lt;typename T&gt;
struct remove_const {
    using type = T;
};

template&lt;typename T&gt;
struct remove_const&lt;const T&gt; {
    using type = T;
};

int main() {
    int a = 1;
    const int b = 2;
    remove_const&lt;decltype(a)&gt;::type aa = 3;
    remove_const&lt;decltype(b)&gt;::type bb = 4;
    std::cout &lt;&lt; std::is_same&lt;decltype(aa), int&gt;::value &lt;&lt; std::endl;
    std::cout &lt;&lt; std::is_same&lt;decltype(bb), int&gt;::value &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p dir="auto">运行结果:</p>
<blockquote>
<p dir="auto">给带const的类型，写了一个特化版本。所以当remove_const接受一个带const的类型时，就会通过这个偏特化版本实例化，由于这个偏特化版本把const从类型中分离出来了，则这里的T就是没有const的类型，从而实现去除类型const的功能。</p>
</blockquote>
<p dir="auto"><img src="/assets/uploads/files/1765188887344-v2-d337e4dc338fc9a90fcfa7ef9db27804_1440w.png" alt="v2-d337e4dc338fc9a90fcfa7ef9db27804_1440w.png" class=" img-fluid img-markdown" /></p>
<h2>三、模板特化存在性问题</h2>
<p dir="auto">一个类模板的特化，是对某一个类模板的子集做特化处理的。而它不能"独立存在"。既只有存在一个类模板X, 才能存在对它特化的版本。</p>
<pre><code>template&lt;typename T&gt;
class A&lt;T *&gt; {};

int main() { return 0; }
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1765188925072-v2-1023f2d6ec20e5efa6300629068527d6_1440w.png" alt="v2-1023f2d6ec20e5efa6300629068527d6_1440w.png" class=" img-fluid img-markdown" /></p>
]]></description><link>http://forum.d2learn.org/topic/151/现代c-泛型编程初识-类模板到模板特例化及具体应用示例</link><guid isPermaLink="true">http://forum.d2learn.org/topic/151/现代c-泛型编程初识-类模板到模板特例化及具体应用示例</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Mon, 08 Dec 2025 10:16:16 GMT</pubDate></item><item><title><![CDATA[project-auto-backup: 项目自动定时备份, 支持多项目 + 示例&#x2F;模板项目 Project-Auto-backup]]></title><description><![CDATA[<ul>
<li>示例/模板项目: <a href="https://github.com/Sunrisepeak/project-auto-backup" rel="nofollow ugc">https://github.com/Sunrisepeak/project-auto-backup</a></li>
<li>git-autosync实现: <a href="https://github.com/d2learn/xim-pkgindex/tree/main/pkgs/g/git-autosync.lua" rel="nofollow ugc">https://github.com/d2learn/xim-pkgindex/tree/main/pkgs/g/git-autosync.lua</a></li>
</ul>
<hr />
<h1>project-auto-backup</h1>
<p dir="auto">project auto backup by git-autosync (xscript</p>
<h2>Quick Start / 快速开始</h2>
<blockquote>
<p dir="auto">run in project root directory</p>
</blockquote>
<p dir="auto"><strong>step0: get this project / 获取项目</strong></p>
<pre><code class="language-bash">git clone https://github.com/Sunrisepeak/project-auto-backup.git
</code></pre>
<p dir="auto"><strong>step1: install deps(git-autosync) &amp; auto config / 安装依赖并自动配置</strong></p>
<pre><code>xlings install
</code></pre>
<blockquote>
<ul>
<li><a href="https://xlings.d2learn.org/documents/quick-start/one-click-install.html" rel="nofollow ugc">download xlings</a></li>
<li>default sync project when 01:00 in everyday / 默认每天凌晨1点同步</li>
</ul>
</blockquote>
<p dir="auto"><strong>step2: add your git url to <code>.git-autosync</code> / 添加git仓库url到<code>.git-autosync</code>文件</strong></p>
<ul>
<li>support https and ssh</li>
</ul>
<p dir="auto"><strong>step3: manual sync / 手动同步 (可选)</strong></p>
<pre><code>git-autosync sync
</code></pre>
<h2>More Features / 更多功能</h2>
<p dir="auto">**add sync task (option/default) **</p>
<pre><code class="language-bash">git-autosync add . --time "* * * 1 *"
</code></pre>
<ul>
<li><code>--tmie</code>: [Week Month Day Hour Minute]
<ul>
<li><code>* * * 1 *</code>: when 01:00 for everyday</li>
<li><code>Mon * * 1 *</code>: when Mon's 01:00 for every week</li>
</ul>
</li>
</ul>
<p dir="auto"><strong>get task list or log</strong></p>
<pre><code class="language-bash">git-autosync log
git-autosync list
</code></pre>
<h2>Other</h2>
<ul>
<li>xlings: <a href="https://github.com/d2learn/xlings" rel="nofollow ugc">https://github.com/d2learn/xlings</a></li>
<li>git-autosync: <a href="https://github.com/d2learn/xim-pkgindex/tree/main/pkgs/g/git-autosync.lua" rel="nofollow ugc">https://github.com/d2learn/xim-pkgindex/tree/main/pkgs/g/git-autosync.lua</a></li>
</ul>
]]></description><link>http://forum.d2learn.org/topic/138/project-auto-backup-项目自动定时备份-支持多项目-示例-模板项目-project-auto-backup</link><guid isPermaLink="true">http://forum.d2learn.org/topic/138/project-auto-backup-项目自动定时备份-支持多项目-示例-模板项目-project-auto-backup</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Fri, 03 Oct 2025 12:43:37 GMT</pubDate></item><item><title><![CDATA[【xlings】一键安装配置Dev C++以及中&#x2F;英文设置的三种方法, 镜像下载加速]]></title><description><![CDATA[<p dir="auto">@335582 可能是编码问题: http://forum.d2learn.org/post/597</p>
]]></description><link>http://forum.d2learn.org/topic/134/xlings-一键安装配置dev-c-以及中-英文设置的三种方法-镜像下载加速</link><guid isPermaLink="true">http://forum.d2learn.org/topic/134/xlings-一键安装配置dev-c-以及中-英文设置的三种方法-镜像下载加速</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Sat, 20 Sep 2025 10:35:43 GMT</pubDate></item><item><title><![CDATA[TechTalks: Android系统真的要闭源了? -- AOSP项目政策(可能)变化解读]]></title><description><![CDATA[<p dir="auto">@blogkj 1.4和2.3里大概分析了以下, Google的透露出来的说法是, 认为外部开发者的贡献的改动带来的维护成本, 可能反而还影响了开发进度和提高了开发成本。所以, 基本后面Google对于AOSP社区的策略基本只做代码发布/展示的功能, 而不会去发展社区在AOSP项目的影响力, 更多以公司视角做TOB的事情, 基本放弃社区推动项目发展的想法</p>

aosp: 以公司为主推动项目的发展, 外部开发者后面基本很难参与
linux: 以社区为主推动项目发展, 所有个人和组织都要以社区里的角色进行参与

<p dir="auto">大概就是这种的差异</p>
]]></description><link>http://forum.d2learn.org/topic/76/techtalks-android系统真的要闭源了-aosp项目政策-可能-变化解读</link><guid isPermaLink="true">http://forum.d2learn.org/topic/76/techtalks-android系统真的要闭源了-aosp项目政策-可能-变化解读</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Sat, 29 Mar 2025 21:36:43 GMT</pubDate></item><item><title><![CDATA[如何使用ImGui中的DrawList制动一个动画控件? - Loading动画控件]]></title><description><![CDATA[<p dir="auto">@sky-littlestar</p>
<p dir="auto">https://github.com/Sunrisepeak/Hanim/blob/main/old_project/ImGui.hanim.hpp  这个里有具体实现</p>
<p dir="auto">动画数据是用相对坐标生成的(假设开始是(0, 0)), 渲染的时候根据父窗口做平移</p>
]]></description><link>http://forum.d2learn.org/topic/17/如何使用imgui中的drawlist制动一个动画控件-loading动画控件</link><guid isPermaLink="true">http://forum.d2learn.org/topic/17/如何使用imgui中的drawlist制动一个动画控件-loading动画控件</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Fri, 11 Oct 2024 07:53:25 GMT</pubDate></item><item><title><![CDATA[当用计算机思维进行Logo设计时? | D2Learn开源社区]]></title><description><![CDATA[<p dir="auto">增加了一个像素点之间液化连接视觉测试功能</p>
&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8" /&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;style&gt;
      body {
        background-color: black;
        color: white;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        height: 100vh; /* 使 body 高度为视口高度 */
        margin: 0; /* 去除默认的 margin */
      }
      .matrix {
        display: flex;
        flex-direction: column;
        margin: 10px 0;
        padding: 5px;
        filter: contrast(500%);
      }
      .row {
        display: flex;
      }
      .cell {
        width: 20px; /* 每个单元格的宽度 */
        height: 20px; /* 每个单元格的高度 */
        display: flex;
        align-items: center;
        justify-content: center;
        border: none; /* 单元格边框 */
        margin: 0; /* 单元格间距 */
        filter: blur(10px); /* 默认模糊效果 */
        transition: filter 0.3s ease; /* 过渡效果 */
      }
      .cell.true {
        background-color: rgb(255, 255, 255); /* 1 的背景色 */
      }
      .cell.false {
        background-color: rgb(0, 0, 0); /* 0 的背景色 */
      }
      .slider-container {
        margin-top: 20px; /* 滑动框与矩阵的间距 */
      }
      .input-container {
        margin-bottom: 20px; /* 输入框与滑动框的间距 */
      }
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class="input-container"&gt;
      &lt;label for="wordInput"&gt;输入单词: &lt;/label&gt;
      &lt;input type="text" id="wordInput" value="d2learn" /&gt;
      &lt;button id="lookUpButton"&gt;查询&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class="slider-container"&gt;
      &lt;label for="blurRange"&gt;调整模糊程度: &lt;/label&gt;
      &lt;input type="range" id="blurRange" min="0" max="50" value="10" /&gt;
    &lt;/div&gt;
    &lt;div class="slider-container"&gt;
      &lt;label for="contrastRange"&gt;调整对比度: &lt;/label&gt;
      &lt;input type="range" id="contrastRange" min="100" max="5000" value="500" /&gt;
    &lt;/div&gt;
    &lt;script&gt;
      function charToAsciiBinaryArray(char) {
        const asciiCode = char.charCodeAt(0);
        const binaryString = asciiCode.toString(2).padStart(8, "0");
        return Array.from(binaryString, (bit) =&gt; bit === "1");
      }

      function stringToBinaryArrays(str) {
        return str.split("").map(charToAsciiBinaryArray);
      }

      function updateMatrix(word) {
        const d2learnBinaryArray = stringToBinaryArrays(word);

        // 清空矩阵内容
        matrixContainer.innerHTML = "";

        // 创建新的矩阵并添加到 body 中
        d2learnBinaryArray.forEach((row) =&gt; {
          const rowDiv = document.createElement("div");
          rowDiv.className = "row";
          row.forEach((cell) =&gt; {
            const cellDiv = document.createElement("div");
            cellDiv.className = "cell " + (cell ? "true" : "false");
            rowDiv.appendChild(cellDiv);
          });
          matrixContainer.appendChild(rowDiv);
        });
      }

      const matrixContainer = document.createElement("div");
      matrixContainer.className = "matrix";
      document.body.appendChild(matrixContainer);

      // 初始化默认显示 "d2learn" 的矩阵
      updateMatrix("d2learn");

      // 处理输入框和查询按钮的事件
      const lookUpButton = document.getElementById("lookUpButton");
      lookUpButton.addEventListener("click", () =&gt; {
        const word = document.getElementById("wordInput").value; // 获取输入的单词
        updateMatrix(word); // 更新矩阵
      });

      // 处理模糊度滑动框的输入事件
      const blurRange = document.getElementById("blurRange");
      blurRange.addEventListener("input", () =&gt; {
        const blurValue = blurRange.value; // 获取当前的滑动值
        const cells = document.querySelectorAll('.cell');
        cells.forEach(cell =&gt; {
          cell.style.filter = `blur(${blurValue}px)`; // 设置模糊效果
        });
      });

      // 处理对比度滑动框的输入事件
      const contrastRange = document.getElementById("contrastRange");
      contrastRange.addEventListener("input", () =&gt; {
        const contrastValue = contrastRange.value; // 获取当前的滑动值
        matrixContainer.style.filter = `contrast(${contrastValue}%)`; // 设置对比度效果
      });

      console.log(d2learnBinaryArray);
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;


]]></description><link>http://forum.d2learn.org/topic/11/当用计算机思维进行logo设计时-d2learn开源社区</link><guid isPermaLink="true">http://forum.d2learn.org/topic/11/当用计算机思维进行logo设计时-d2learn开源社区</guid><dc:creator><![CDATA[Littlefean]]></dc:creator><pubDate>Sat, 05 Oct 2024 11:19:56 GMT</pubDate></item></channel></rss>