C_and_CPP 板


LINE

藉着这串来说一下我对 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 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.33.205.79
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1477252854.A.31D.html 我觉得自己讲得好乱 XD 先睡觉,明天再来整理一下好了 ※ 编辑: CoNsTaR (114.33.205.79), 10/24/2016 04:23:17
1F:推 steve1012: 看不懂... 10/24 05:47
2F:推 soheadsome: 学haskell之类的FP就会了解型别推论之类的技术 10/24 10:47







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP