元编程求阶乘有计算优势,但必须在程序中输入常量,这个只适用特定业应用场景。
#include <stdint.h>
#include <iostream>
#include <type_traits>
using namespace std;
template <unsigned n>
struct factorial : std::integral_constant<uint64_t, n * factorial<n - 1>::value> {
};
template <>
struct factorial<0> : std::integral_constant<uint64_t, 1> {
};
uint64_t factorial1(int n) {
uint64_t s = 1;
for (int i = 1;i <= n;i++) {
s *= i;
}
return s;
}
int main() {
// cout << factorial<65>::value << endl; // 9223372036854775808
// cout << factorial1(65) << endl; // 9223372036854775808
for (int i = 0;i < 10000000;i++) {
// factorial<65>::value; // 0.048s
factorial1(65); // 1.355s
}
return 0;
}