From a371b34d739d212c7adcf92eb65abeffe13c1c34 Mon Sep 17 00:00:00 2001 From: jiacai2050 Date: Mon, 8 Apr 2024 23:06:02 +0800 Subject: [PATCH] polish --- content/post/2024-04-06-zig-cpp.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/post/2024-04-06-zig-cpp.md b/content/post/2024-04-06-zig-cpp.md index c2fec6a..103c939 100644 --- a/content/post/2024-04-06-zig-cpp.md +++ b/content/post/2024-04-06-zig-cpp.md @@ -85,9 +85,9 @@ struct Fn { Fn sizeof(B), A, B>::OutputType ``` -这就是比较类型的大小,如果 A 大,OutputType 就是 A,如果 B 大,OutputType 就是 B。这种类型生成的方式对于开发者来说完全是黑盒的,需要依赖编译器的特殊支持,有种声明式语言的特点,即:结果导向,不关心具体实现逻辑。 +这段代码表面上看是声明了一个类型 OutputType,而这个类型的生成依赖于一些条件。而这些条件就是模板元编程,用来从 A 和 B 中选择类型大小更大的类型,如果想要表达更复杂的逻辑,则需要掌握更多模板的奇技淫巧。 -如果用 Zig 来做,则完全是命令式的,即关心实现过程,通过一系列基本步骤来达到目的。上面这个例子用 Zig 来实现的话,逻辑如下: +如果用 Zig 来做,则要简单的多: ```Zig fn Fn(comptime A:type, comptime B: type) type { @@ -102,7 +102,7 @@ fn Fn(comptime A:type, comptime B: type) type { 我们再来看递归的列子。比如有一个类型的 list,我们需要返回其中第 N 个 type。同样,由于在 C++中,类型不是一等成员,因此我们不可能有一个`vector`的东东。那怎么办呢?方法就是直接把`type list`放在模板的参数列表里:`typename ...T`。 -于是,我们写出“函数原型”。 +于是,我们写出“函数原型”: ```C++ template