Re: [语法] Template与Inheritance结合??

楼主: CoNsTaR ((const *))   2016-10-24 04:00:51
藉著这串来说一下我对 C++ template 和相关东西的理解好了
因为 template 好像有很多很神的功能,学都学不完,学完了也不知道在哪边用(?)
可是 template 其实根本就没有那么深奥,都是我们自己把它想得太难了…
怎么说呢?
我想必须先介绍一个新的概念 —— universe ——
要是我有一些值,例如数字或是字符,而且数字又有正数有负数有整数有小数,字符也分
一般字符和宽字符,而我的任务是负责分类它们,我会怎么做?
T = { x | x ∈ R, INT_MIN <= x <= INT_MAX } 的 T 代表了"一种类型"的值 (例如在
这里是 int)
讲成英文就是 T is "a type of" value
也就是说,T 可以看成是所有 x 的 type
我们可以这样想:
int x ≡ x ∈ int (叙述 int x 相当于 x 属于 int)
也就是说,types 是由 values 组成的集合,所有的 values 都有 type,而 values 是
types 的 member
因为这些 values 都有一些相同的特征,它们都满足特定的条件,所以我把它们归类成一
个 type
接下来的问题是这样的,借由分类 values 我得到了很多的 types
但是我发现很多 type 其实也有共通点,我想再做更高程度的抽象化,再把 types 进行
分类
举个简单的例子:
Animal = { Bird, Dog, Pig, Cat... }
那我会说,Animal 是"一个种类"的 type
讲成英文就是 Animal is "a kind of" type
再举个实用的例子:
Printable = { int, char, double... }
(或许有些 type 不能 print 也说不定啊 XD)
我们可以这样想:
template <typename T> struct S {} ≡ S = ∀T. { S<T> }
当然,就像大家想像的,kinds 当然还可以再被归类,kind 会被归类成 sort,而 sort
又可以再被归类成 BOX…
而 value, type, kind, sort, BOX… 这样的系统就被称为 universe
上面都懂了以后,最直觉的联想就是,values 有 function,那 types 有吗?如果有,
那 kinds 呢?
答案是都有!
为了有个统一的表示法,我先规定一下函数的表示法好了
函数宣告:
add_and_ : { a : Num } → a → a → a
xxx : xxx
函数名称 : 型态
底线代表接受参数的地方,不写就是接在后面
{ a : Num } →
代表 a 是 Num 这个 kind 里的一个 type
a → a → a
参数1型态 → 参数2型态 → 回传型态
函数定义:
add a and b = a + b
函数呼叫:
add 1 and 2
(答案是3)
我们先来看一个比较容易的例子好了:“pointers”
C/C++ 指标其实不就是 type 的 function 吗?
如果用一般 function 的方式来理解的话,那指标这个函式应该长类似这样:
_* : typename → typename
T* = pointer_of_T
写成 C++ 的话:
typename
* (typename T)
{ return pointer_of_T; }
问题是,C++ 根本不允许我们做这种事情啊…
所以我们就必须要动点头脑想想,有什么合法的 C++ 语法能够表达相同概念的呢?
template 或许可以做到:
template <typename T>
struct *
{ using type = pointer_of_T; };
"T" 代表传入的 type,"*<T>::type" 代表回传 type,"<>::type" 相当于函数呼叫,而
"*" 则是函数名称
有上面这些概念之后,其实自然而然就会不小心做出 smart pointers 了 XD
我们再来看另一个例子吧:“继承”
_:_ : typename → typename → typename
T : U = U :> T
写成 C++ 的话:
typename
: (typename& T, typename U)
{
// 做一些神奇的魔法,让 T 拥有所有 U 的成员,或许 T 该被 passed by reference
return T;
}
所以说,一次继承很多个 type 该怎么办?
typename
: (typename& T, ...)
{
// 管你可变参数列里面是什么通通继承就对了
return T;
}
当然,实际上 C++ 才不允许我们这样乱搞勒,不过还是能用 template 做到类似的功能

其实还有很多好玩的东西原本是想在这篇提的,只是看看这篇篇幅已经不短了,所以想想
还是算了吧…
如果你想问有哪个语言有完整的 universe 的观念,而且这篇里面提到的所有东西(包括
表示法)通通都支援的,那就是 agda 啦
对了,因为 C++ 的 sort 是 template template,所以要是你下次在写程式的时候发现
你用了 template template 的话,那就代表你正在用 sort 喔!有没有很感动的感觉 XD
作者: steve1012 (steve)   2016-10-24 05:47:00
看不懂...
作者: soheadsome (师大狗鼻哥)   2016-10-24 10:47:00
学haskell之类的FP就会了解型别推论之类的技术

Links booklink

Contact Us: admin [ a t ] ucptt.com