面试题答案
一键面试#include <iostream>
// 函数模板声明
template <const int* n>
constexpr int factorial();
// 主模板特化,用于终止递归
template <>
constexpr int factorial<0>() {
return 1;
}
// 递归模板特化,用于计算阶乘
template <const int* n>
constexpr int factorial() {
return (*n) * factorial<n - 1>();
}
int main() {
constexpr int num1 = 5;
constexpr int num2 = 3;
const int* ptr1 = &num1;
const int* ptr2 = &num2;
std::cout << "Factorial of " << num1 << " is " << factorial<ptr1>() << std::endl;
std::cout << "Factorial of " << num2 << " is " << factorial<ptr2>() << std::endl;
return 0;
}
编译期计算的实现
- 模板元编程:C++模板元编程允许在编译期进行计算。通过模板特化和递归,编译器在编译阶段就能完成阶乘的计算。
constexpr
:constexpr
关键字用于声明在编译期就能求值的函数或变量。在这个例子中,factorial
函数模板被声明为constexpr
,使得它的调用可以在编译期完成。- 递归模板特化:通过递归模板特化,
factorial
函数模板在编译期根据不同的指针值递归调用自身,直到满足终止条件(指针值为0)。
指针参数的意义
- 传递编译期常量:指针指向
constexpr
整数,这样可以在编译期传递常量值,使得模板元编程能够在编译期根据这些常量进行计算。 - 控制模板实例化:指针作为模板参数,可以控制模板的实例化。不同的指针值会导致不同的模板实例化,从而实现不同参数的编译期计算。
通过以上方式,利用C++模板元编程和指针作为函数参数的特性,成功实现了编译期计算阶乘的功能。