作者godfat (godfat 真常)
看板PLT
标题Re: [心得] Dependent Type "简"介
时间Mon Oct 1 20:37:35 2007
网路快多了 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