考虑以下简单函数
void foo_rt(int n) {
for(int i=0; i<n; ++i) {
// ... do something relatively cheap ...
}
}
如果我n
在编译时知道参数,我可以编写相同函数的模板版本:
template<int n>
void foo_ct() {
for(int i=0; i<n; ++i) {
// ... do something relatively cheap ...
}
}
这允许编译器执行循环展开之类的操作,从而提高速度。
但是现在假设我有时在编译时知道n
,有时只在运行时知道。如何在不维护两个版本的函数的情况下实现这一点?我在想一些事情:
inline void foo(int n) {
for(int i=0; i<n; ++i) {
// ... do something relatively cheap ...
}
}
// Runtime version
void foo_rt(int n) { foo(n); }
// Compiletime version
template<int n>
void foo_ct() { foo(n); }
但我不确定是否所有编译器都足够聪明来处理这个问题。有没有更好的办法?
编辑:
显然,一种可行的解决方案是使用宏,但我真的想避免这种情况:
#define foo_body \
{ \
for(int i=0; i<n; ++i) { \
// ... do something relatively cheap ... \
} \
}
// Runtime version
void foo_rt(int n) foo_body
// Compiletime version
template<int n>
void foo_ct() foo_body