MST

星途 面试题库

面试题:C++枚举类型与模板结合的实际应用

假设你需要设计一个通用的模板类,该类的行为会根据传入的枚举类型进行不同的操作。请编写这样一个模板类,并解释在实现过程中如何处理枚举类型的各种特性,比如作用域、取值范围等,以确保模板类的正确性和通用性。
45.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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; // 避免编译警告,实际上不会执行到这里
    }
};

关于处理枚举类型特性的解释

  1. 作用域
    • 使用 enum class 定义枚举类型,这种方式引入了强作用域。例如,在上述代码中,OperationType::ADD 明确指出 ADDOperationType 枚举类型中的成员。这避免了与其他枚举或全局命名空间中的同名标识符冲突。在模板类 MathOperation 中,我们通过在模板参数中使用 OperationType 限定了枚举类型,从而确保了模板类对该枚举类型作用域的正确处理。
  2. 取值范围
    • C++ 中枚举类型的取值范围由其基础类型决定。对于 enum class,如果没有显式指定基础类型,默认基础类型为 int。在上述代码中,OperationType 的取值范围实际就是 int 的取值范围(通常为 -21474836482147483647),但实际有效的值只有 ADDSUBTRACTMULTIPLY 这三个。在 MathOperation 类的 execute 方法中,通过 switch 语句对这三个有效的枚举值进行处理,没有处理其他无效值,从而确保了模板类的正确性。同时,由于取值范围与 int 相关,在内存占用和性能方面,遵循 int 的相关规则,不会因为枚举类型的使用而带来特殊的内存或性能问题,保证了通用性。

可以通过以下方式使用这个模板类:

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;
}