编译期如何检查类是否实现特定属性或方法(哈希表场景示例)
基于
operator<检测的哈希表桶类型自动选择 我正在实现一个采用链地址法解决哈希冲突的哈希表示例,核心需求是:根据存入哈希表的key_type是否实现了<运算符,自动选择桶的存储结构:
- 若
key_type支持operator<,则用std::map(红黑树实现)作为桶的存储类型,利用有序结构优化查找性能 - 若不支持该运算符,则只能退化为
std::list存储键值对
最初设想的伪代码如下:
#ifimplement operator< typedef map<key_type, value_type> bucket_type; #else typedef list<pair<key_type, value_type> > bucket_type; #endif
在C++中,可以通过**SFINAE(替换失败并非错误)**结合模板元编程技术实现这一逻辑,具体代码如下:
#include <map> #include <list> #include <type_traits> // 辅助模板:检测类型是否支持operator< template<typename T> struct has_less_operator { private: // 尝试调用<运算符的测试函数 template<typename U> static auto test(int) -> decltype(std::declval<U>() < std::declval<U>(), std::true_type{}); // 匹配失败时的 fallback template<typename U> static std::false_type test(...); public: static constexpr bool value = decltype(test<T>(0))::value; }; // 利用条件模板选择桶类型 template<typename Key, typename Value> struct bucket_selector { using type = typename std::conditional_t< has_less_operator<Key>::value, std::map<Key, Value>, std::list<std::pair<Key, Value>> >; }; // 定义bucket_type别名 template<typename Key, typename Value> using bucket_type = typename bucket_selector<Key, Value>::type;
代码说明
has_less_operator结构体通过SFINAE机制在编译期检测Key类型是否支持<运算符std::conditional_t根据检测结果,在std::map和std::list之间选择对应的桶类型- 最终通过
bucket_type别名对外暴露选择后的存储类型
内容的提问来源于stack exchange,提问作者wangjianyu
相关产品推荐
相关产品推荐

