次の単純な関数を考えてみましょう
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 ...
}
}
これにより、コンパイラはループ展開などを実行できるようになり、速度が向上します。
しかし、ここで、コンパイル時と実行時のみを知っていると仮定します。関数の2つのバージョンを維持せずにこれを実装するにはどうすればよいですか?私は線に沿って何かを考えていました: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); }
しかし、すべてのコンパイラがこれに対処するのに十分賢いかどうかはわかりません。もっと良い方法はありますか?
編集:
明らかに、機能する1つの解決策はマクロを使用することですが、これは本当に避けたいものです。
#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