You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为枚举类型特化Printer模板类(不修改原模板)

可以实现,无需修改原通用模板

我们可以通过模板偏特化结合C++的类型特性来实现仅针对枚举类型的Printer特化,不需要修改原模板的参数列表。以下分两种标准版本给出实现方案:

C++20 及以后(推荐,语法更清晰)

利用C++20引入的requires子句直接约束模板参数为枚举类型:

#include <type_traits>
#include <iostream>

// 原通用模板(不可修改)
template <typename TData>
class Printer {
 public:
    bool Write(std::ostream& ostr, const TData& data) const {
        ostr << data;
        return true;
    }
};

// 针对枚举类型的偏特化
template <typename TEnum>
requires std::is_enum_v<TEnum>
class Printer<TEnum> {
 public:
    bool Write(std::ostream& ostr, const TEnum& data) const {
        static Printer<int> int_printer;
        return int_printer.Write(ostr, static_cast<int>(data));
    }
};

C11 至 C17 版本

借助std::enable_if和std::is_enum实现SFINAE约束,通过模板参数的默认值完成偏特化:

#include <type_traits>
#include <iostream>

// 原通用模板(不可修改)
template <typename TData>
class Printer {
 public:
    bool Write(std::ostream& ostr, const TData& data) const {
        ostr << data;
        return true;
    }
};

// 针对枚举类型的偏特化
template <typename TEnum, typename = typename std::enable_if<std::is_enum<TEnum>::value>::type>
class Printer<TEnum> {
 public:
    bool Write(std::ostream& ostr, const TEnum& data) const {
        static Printer<int> int_printer;
        return int_printer.Write(ostr, static_cast<int>(data));
    }
};

测试示例

定义枚举并使用特化的Printer:

enum class Color { Red, Green, Blue };

int main() {
    Printer<Color> color_printer;
    color_printer.Write(std::cout, Color::Green); // 输出:1
    return 0;
}

原理说明

  • 当模板参数T是枚举类型时,编译器会优先匹配我们定义的偏特化版本;
  • 非枚举类型则会使用原通用模板的实现;
  • 两种方案都没有修改原模板的参数列表,完全符合需求。

内容的提问来源于stack exchange,提问作者dEmigOd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:19:53