たとえば、factorial(n) の場合、引数が定数 (式) の場合、結果は決定論的であり、コンパイル時に (テンプレート メタプログラミングを使用して) 実行できます。
呼び出されるたびに、引数が定数の場合はコンパイル時に結果が計算され、変数の場合は実行時に計算されるように、単一の関数を作成することは可能ですか?
たとえば、factorial(n) の場合、引数が定数 (式) の場合、結果は決定論的であり、コンパイル時に (テンプレート メタプログラミングを使用して) 実行できます。
呼び出されるたびに、引数が定数の場合はコンパイル時に結果が計算され、変数の場合は実行時に計算されるように、単一の関数を作成することは可能ですか?
これはまさにconstexpr
関数が存在する目的です。constexpr
関数は C++11 で導入されました。コンパイル時に評価できる定数式で呼び出された場合、それらはコンパイル時に評価される傾向があります (これを強制的に実行できる場合もあります)。ただし、原則として保証はできません。それ以外の場合は、実行時に評価されます (実行時に計算される定数または非定数の引数を使用して、通常の関数と同じように呼び出すことができます)。
ただし、コンパイル時の評価が保証されないことは別として、constexpr
関数には制約があります。単一の return ステートメントのみで構成する必要があるため、複雑な計算を実行する方法を探している場合、これは適合しません。あなたの要望。それにもかかわらず、constexpr
関数はおそらく探しているものに最も近いものです。
関数の例について言及したので、factorial()
これが関数でどのように見えるかを次に示しconstexpr
ます。
#include <iostream>
using namespace std;
constexpr int factorial(int n)
{
return (n == 0) ? 1 : factorial(n - 1);
}
int foo()
{
int result = 1;
// do some processing...
return result;
}
int main()
{
int v[factorial(5)]; // Evaluated at compile-time
cout << factorial(foo()); // Evaluated at run-time
}