作者jeunder (omega~ oh my god)
看板CSSE
标题[CPP] compile time 与 run time 之间的代沟
时间Mon Jun 27 17:20:36 2005
假设有个函数 int f(int), 利用此函数计算数列的值 f(0), f(1), ..., f(N-1).
如果 f(n) 的计算很耗费时间, 并且给定 n 值, f(n) 值就可以确定了. 通常我们
会建立表格阵列, 以便之後的多次引用, 不需再重复耗费计算能量
int table[N];
for(int i = 0; i < N; ++i)
table[i] = f(i);
又假设 f(n) 值其实是可以在 compile time 计算出来的, 利用整数模板来计算,
像这样 f<0>::value, f<1>::value, ..., f<N-1>::value. 这样一来, 数列的计
算可以在 compile time 完成, 但是产生了新的问题. 原本 f(n) 的计算, n 值
可以在 run time 才决定, 但利用整数模板之後, f<n>::value 的 n 值却得在
compile time 就决定了, 也就是说, 做以下的事情是不被允许的
cin >> n;
cout << ( f<n>::value );
因为整数模板的整数值无法延到 run time 才决定, 最简单的解决方法就是做苦工
#define F(n) f<(n)>::value
int table[] = { F(0), F(1), ..., F(N-1) };
但是这样做就觉得很丑, 每次要改变 N 值的范围, 就得在编辑器复制贴上. C++语
言似乎缺乏在 source code level 的 for loop (或者说我可以称此为 coding time
的 for loop), 而在 compile time 的 for loop (整数模板), 却又被过度限制,
想在 compile time 填写阵列表格也似乎做不到...?
讲到这里, 讲了好多, 好像我是来教导些什麽的? 其实我是来发问问题的 :p
要怎样才能漂亮的解决以上问题, 在 run time 之前就把表格填好, 并且可在
run time 以动态决定的索引来存取这个表格?
附注1: 只是单纯的想讨论这个问题, 想知道怎麽做, 至於该不该去这麽做, 或者
适不适当, 并非此处讨论的重点.
附注2: 我知道可以用程式写工具来帮助自己写程式, 利用工具来转换或者产生程
式码, 但是我只想局限在语言本身的机制, 寻求看看是否有漂亮的解答?
附注3: 突然想到了巨集 #define, 以及那两个令人昏头的运算子 # 与 ##, 似乎
是一种可能的解决方案?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.219.228
※ 编辑: jeunder 来自: 61.230.219.228 (06/27 18:09)