用 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;
}