3

たとえば、factorial(n) の場合、引数が定数 (式) の場合、結果は決定論的であり、コンパイル時に (テンプレート メタプログラミングを使用して) 実行できます。

呼び出されるたびに、引数が定数の場合はコンパイル時に結果が計算され、変数の場合は実行時に計算されるように、単一の関数を作成することは可能ですか?

4

1 に答える 1

5

これはまさに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
}
于 2013-01-27T22:06:37.597 に答える