利用SFINAE+模板函数偏特化,判断一系列类似的枚举是否有某种成员,并写针对这一系列的通用打印函数

SFINEA的概念就是在模板的实例化过程中,如果一种实例方法匹配失败了,不会报错,而是继续寻找其它实例方法。

在最近的应用中,我碰到一个需要打印枚举的需求,打印枚举,一般的实现就是在打印枚举的函数里面写一个局部静态的哈希表(std::unordered_map),把枚举值和要输出的字符串一一对应。类似于这种:

    static const char* Enum2Str(Format content) {
        static auto && enum_map = []() {
            EnumMap<Format> ret{ {Format::Red, "Format::Red"}};
            return ret;
        }();
        return enum_map[content];
    }

强枚举类型的哈希值可以利用std::is_enum来实现(或者我直接简单粗暴地static_cast成ull?)。

template <typename T, std::enable_if_t<std::is_enum<T>::value>* = nullptr>
static std::size_t Hash(T const& t) {
    using base_type = typename std::underlying_type_t<T>;
    return std::hash<base_type>()(static_cast<const base_type>(t));
}

template <typename T, std::enable_if_t<!std::is_enum<T>::value>* = nullptr>
static std::size_t Hash(T const& t) {
    return std::hash<T>(t);
}

struct enum_hash{
    template <typename T>
    std::size_t operator()(const T&val)const {
        return Hash<T>(val);
    }
};
template <typename T>
using EnumMap = std::unordered_map<T, const char *, enum_hash>;

但我碰到的这个,不同的命名空间里面有类似的枚举类型,他们的枚举成员不尽相同。举个栗子,有几个命名空间里的“颜色”“格式”,我这里直接用相同名字+不同编号表示了。每种“颜色”枚举包含的颜色种类不一,每种“格式”类型包含的后缀名也不尽相同。如果命名空间有很多,那么为这一系列的“颜色”“格式”一个个写打印函数肯定存在很多重复代码。但是他们拥有的“颜色”“格式”有可能不一样,不可能一步到位,那样会编不过的。因此需要用到SFINAE。

// 不同的颜色空间
enum class Color0 {
    Red,
    Black,
    Green
};

enum class Color1 {
    White,
    Black,
    Purple
};

enum class Colo
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值