面试题答案
一键面试1. 在模板类中使用 static
的目的和原理
- 目的:在模板类中使用
static
成员,可以为模板类的所有实例化共享一份数据,常用于实现编译期常量或者在不同实例化之间共享状态。 - 原理:模板类的每个实例化都会有自己独立的非
static
成员,但static
成员是所有实例化共享的,它在程序启动时就被分配内存,而不是在每个对象创建时。
2. 编译期计算的应用示例
template <int N>
struct Factorial {
static const int value = N * Factorial<N - 1>::value;
};
template <>
struct Factorial<0> {
static const int value = 1;
};
#include <iostream>
int main() {
std::cout << "5! = " << Factorial<5>::value << std::endl;
return 0;
}
在上述代码中,Factorial
模板类通过递归和 static const
成员来在编译期计算阶乘。Factorial<N>
的 value
依赖于 Factorial<N - 1>
的 value
,直到 Factorial<0>
提供终止条件。static const
确保了这个值在编译期就被确定并可用于其他编译期操作。
3. 类型推导方面的应用示例
template <typename T>
class MyClass {
public:
static void printType() {
std::cout << "Type is ";
if constexpr (std::is_integral_v<T>) {
std::cout << "integral";
} else if constexpr (std::is_floating_point_v<T>) {
std::cout << "floating point";
} else {
std::cout << "other";
}
std::cout << std::endl;
}
};
int main() {
MyClass<int>::printType();
MyClass<double>::printType();
MyClass<std::string>::printType();
return 0;
}
这里 MyClass
模板类的 printType
是一个 static
成员函数,它利用 if constexpr
进行编译期类型判断。通过这种方式,可以在编译期根据模板参数 T
的类型执行不同的代码路径,实现类型推导相关的功能。每个实例化的 MyClass
都共享这个 printType
函数,方便在不同类型实例化时进行类型相关的操作。