を使用constexpr
すると、引数に応じて、コンパイル時または実行時に関数を評価できます。ただし、通常、アルゴリズムはコンパイル時と実行時で異なる必要があります。例えば。階乗のconstexprバージョンを考えてみましょう。
constexpr int fact(int n)
{
return (n)?n*fact(n-1):1;
}
実行時に発生した場合n
、関数は1つのforループよりも非効率になりませんか?関数がコンパイル時または実行時に実行されているかどうかを判断し、異なるアルゴリズムを使用するためのテンプレートマジックはありますか?
更新:
階乗は単なる例でした。すべての関数は、制限constexpr
なしでコーディングした場合と同じくらい効率的ですか?constexpr
例えば:
constexpr int combinations(int n, int k)
{
//Assume all error conditions and edge conditions are taken care with ternary operator ?:
return fact(n)/(fact(k)*fact(n-k);
}
関数が実行時に記述されている場合は、メモ化の恩恵を受けることができます。constexpr
それでも可能だったとはいえ、実行時にも可能な限り効率的かつ効率的に機能を表現することは難しいと思います。