用 C11(及更高)計算功率

在編譯時使用 C++ 11 及更高版本的計算可以更容易。例如,在編譯時計算給定數字的冪將如下:

template <typename T>
constexpr T calculatePower(T value, unsigned power) {
    return power == 0 ? 1 : value * calculatePower(value, power-1);
}

關鍵字 constexpr 負責在編譯時計算函式,然後才會滿足所有要求(例如,參見 constexpr 關鍵字參考),例如在編譯時必須知道所有引數。

注意:在 C++ 11 中,constexpr 函式必須僅由一個 return 語句組成。

優點:將此方法與編譯時計算的標準方法進行比較,此方法對於執行時計算也很有用。這意味著,如果在編譯時不知道函式的引數(例如,值和功率是通過使用者給出的),則函式在編譯時執行,因此不需要複製程式碼(因為我們將被強制用於較舊的 C++標準)。

例如

void useExample() {
    constexpr int compileTimeCalculated = calculatePower(3, 3); // computes at compile time,
                               // as both arguments are known at compilation time
                               // and used for a constant expression.
    int value;
    std::cin >> value;
    int runtimeCalculated = calculatePower(value, 3);  // runtime calculated,
                                    // because value is known only at runtime.
}

Version >= C++ 17

在編譯時計算功率的另一種方法可以使用 fold 表示式,如下所示:

#include <iostream>
#include <utility>

template <class T, T V, T N, class I = std::make_integer_sequence<T, N>>
struct power;

template <class T, T V, T N, T... Is>
struct power<T, V, N, std::integer_sequence<T, Is...>> {
   static constexpr T value = (static_cast<T>(1) * ... * (V * static_cast<bool>(Is + 1)));
};

int main() {
   std::cout << power<int, 4, 2>::value << std::endl;
}