PLT 板


LINE

看板 PLT  RSS
网路快多了 XD 刚刚打到有点想翻桌 ※ 引述《godfat (godfat 真常)》之铭言: : 但在这个例子中,最佳化良好的话,其实一个 class 都不会产生。 : 因为 compiler 会发现 fact<10>::value 是个常数, : 而其他地方都没有用到 fact<...>..., : 所以 linking 时就会全部舍弃了。 回到我们有长度的 list 上,这边就写成: using std::list; using std::size_t; // usually is unsigned int template <class T, size_t N> struct List: public list<T>{ List(): list<T>(N){} // for size N list List(T t[N]): list<T>(t, t+N){} // init up the data }; 暂时先忽略几件事,size_t 是为了跨平台而定的名称, 通常他就只是 unsigned int. std::list 是标准实作的 list, 暂时当他是只有一个 argument 的 template, 像是 list<int> 就是一个存 int 的 list.(後面还有 allocator 的参数) 直接继承 std::list 是为了运用他的实作,这里只帮他追加长度的属性。 struct 的意思跟 class 近似,只差在预设使用 public. 所以现在 List<int, 5> 就会是一个存有 5 个 int 的 List, 假设写: List<int, 5> a; List<int, 7> b; a = b; 这样是不行的,因为 List<int, 5> 和 List<int, 7> 在 runtime 是「完全」 不同的东西。不过这当然不是意味着他们无法混着使用,因为在 compile-time 还是可以靠着 template 去玩他们。 比方说来定义个 concat, 可以这样写: template <class T, size_t M, size_t N> List<int, M+N> concat(List<T, M> const& xs, List<T, N> const& ys){ List<int, M+N> result; // ...自己想办法把 xs 和 ys 存到 result 中 return result; } List<int, 12> c = concat(a, b); 碰到这里,compiler 就会开始利用 a 与 b 的 type 找到 concat, 会发现 T = int, M = 5, N = 7 於是推断出 return type 会是 List<int, 12>, 再藉由此 type 跟 c 的 type 比对。 结果当然是吻合(不吻合就会有 type error),於是 concat 就能传回正确的资料。 至少长度正确... list 内容是 runtime 的东西,template 就帮不上忙了。 不过 boost 有个 MPL, meta-programming library, 有实作 compile-time 的 list, 那个东西就真的能检查内容正确性了。 只是 template 玩成这样真的是会很累就是了... 毕竟原本不是设计来搞这种东西的。 * 除了整数以外,template 其实也可以放各种 constant address,如: struct Dummy{int i;}; Dummy dummy; 我们知道 global object 的 address 本身是 constant, 也就是 &dummy 会是 const. template <Dummy* D> struct Mummy{ static Dummy* value; // static 成员的初始化要写在外面 }; template <Dummy* D> Dummy* Mummy<D>::value = D; // 这里 於是可以这样去存取: Mummy<&dummy>::value->i = 10; 我也不知道这样做能干嘛就是了...目前好像还没看过有人利用这种特性。 C++ template 就讲到这 @_@ -- In Lisp, you don't just write your program down toward the language, you also build the language up toward your program. 《Programming Bottom-Up》- Paul Graham 1993 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18







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