面试题答案
一键面试#include <iostream>
// 定义一个枚举类型
enum class OperationType {
ADD,
SUBTRACT,
MULTIPLY
};
// 通用模板类
template <OperationType Op>
class MathOperation {
public:
static int execute(int a, int b) {
switch (Op) {
case OperationType::ADD:
return a + b;
case OperationType::SUBTRACT:
return a - b;
case OperationType::MULTIPLY:
return a * b;
}
return 0; // 避免编译警告,实际上不会执行到这里
}
};
关于处理枚举类型特性的解释
- 作用域:
- 使用
enum class
定义枚举类型,这种方式引入了强作用域。例如,在上述代码中,OperationType::ADD
明确指出ADD
是OperationType
枚举类型中的成员。这避免了与其他枚举或全局命名空间中的同名标识符冲突。在模板类MathOperation
中,我们通过在模板参数中使用OperationType
限定了枚举类型,从而确保了模板类对该枚举类型作用域的正确处理。
- 使用
- 取值范围:
- C++ 中枚举类型的取值范围由其基础类型决定。对于
enum class
,如果没有显式指定基础类型,默认基础类型为int
。在上述代码中,OperationType
的取值范围实际就是int
的取值范围(通常为-2147483648
到2147483647
),但实际有效的值只有ADD
、SUBTRACT
和MULTIPLY
这三个。在MathOperation
类的execute
方法中,通过switch
语句对这三个有效的枚举值进行处理,没有处理其他无效值,从而确保了模板类的正确性。同时,由于取值范围与int
相关,在内存占用和性能方面,遵循int
的相关规则,不会因为枚举类型的使用而带来特殊的内存或性能问题,保证了通用性。
- C++ 中枚举类型的取值范围由其基础类型决定。对于
可以通过以下方式使用这个模板类:
int main() {
int result1 = MathOperation<OperationType::ADD>::execute(3, 5);
int result2 = MathOperation<OperationType::SUBTRACT>::execute(10, 4);
int result3 = MathOperation<OperationType::MULTIPLY>::execute(2, 7);
std::cout << "ADD result: " << result1 << std::endl;
std::cout << "SUBTRACT result: " << result2 << std::endl;
std::cout << "MULTIPLY result: " << result3 << std::endl;
return 0;
}