MST

星途 面试题库

面试题:C++ 指针作为函数参数与模板元编程的结合

利用C++模板元编程和指针作为函数参数的特性,实现一个编译期计算阶乘的功能。要求定义一个函数模板`factorial`,其参数为一个指向`constexpr`整数的指针,通过模板特化来完成阶乘计算,并且在`main`函数中通过传递不同的指针来调用这个函数模板,并输出结果。阐述在这个过程中编译期计算是如何实现的以及指针参数的意义。
15.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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;
}

编译期计算的实现

  1. 模板元编程:C++模板元编程允许在编译期进行计算。通过模板特化和递归,编译器在编译阶段就能完成阶乘的计算。
  2. constexprconstexpr关键字用于声明在编译期就能求值的函数或变量。在这个例子中,factorial函数模板被声明为constexpr,使得它的调用可以在编译期完成。
  3. 递归模板特化:通过递归模板特化,factorial函数模板在编译期根据不同的指针值递归调用自身,直到满足终止条件(指针值为0)。

指针参数的意义

  1. 传递编译期常量:指针指向constexpr整数,这样可以在编译期传递常量值,使得模板元编程能够在编译期根据这些常量进行计算。
  2. 控制模板实例化:指针作为模板参数,可以控制模板的实例化。不同的指针值会导致不同的模板实例化,从而实现不同参数的编译期计算。

通过以上方式,利用C++模板元编程和指针作为函数参数的特性,成功实现了编译期计算阶乘的功能。