作者reader (读者)
看板CSSE
标题Re: [CPP] compile time 与 run time 之间的代沟
时间Mon Jun 27 20:30:34 2005
※ 引述《jeunder (omega~ oh my god)》之铭言:
: 假设有个函数 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, 以及那两个令人昏头的运算子 # 与 ##, 似乎
: 是一种可能的解决方案?
只是想知道怎麽做啊... 好吧,以下:
int table[N];
template<int i> int f();
template<int i> void function init_f() {
table[i-1] = f<i-1>();
if(i) init_f<i-1>();
}
void main() {
init_f<N>();
cin >> n;
cout << table[n];
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.222.173.29