C++中如何检查类型T是否为std::pair<?, bool>及优雅匹配泛型?
问题解答
一、修改can_insert以匹配任意首元素、次元素为bool的std::pair
要实现类似Java中? extends Pair<?, Boolean>的通配符匹配逻辑,我们可以先定义一个辅助类型特征,用来判断某个类型是否是第二个元素为bool的std::pair,不管第一个元素是什么类型。
步骤1:定义辅助类型特征
#include <type_traits> #include <utility> // 基础模板:默认不匹配 template <typename> struct is_pair_with_bool_second : std::false_type {}; // 特化模板:匹配任意First类型、第二个元素为bool的std::pair template <typename First> struct is_pair_with_bool_second<std::pair<First, bool>> : std::true_type {}; // 便捷变量模板,简化使用 template <typename T> inline constexpr bool is_pair_with_bool_second_v = is_pair_with_bool_second<T>::value;
步骤2:修改can_insert的SFINAE检查
把原来严格匹配std::pair<typename T::iterator, bool>的逻辑,替换成用上面的辅助特征判断返回值类型:
template <typename T, typename U, typename = void> struct can_insert : std::false_type {}; template <typename T, typename U> struct can_insert<T, U, std::enable_if_t< // 检查insert返回值是否是"第二个元素为bool的std::pair" is_pair_with_bool_second_v<decltype(std::declval<T>().insert(std::declval<U>()))>, void > > : std::true_type {}; template <typename T, typename U> inline constexpr auto can_insert_v = can_insert<T, U>::value;
这样一来,只要T::insert(U)返回的是任意首元素类型、次元素为bool的std::pair,can_insert_v<T, U>就会为true,完美实现了类似Java通配符的模糊匹配效果。
二、直接检查类型是否为任意首元素、次元素为bool的std::pair
上面定义的is_pair_with_bool_second和is_pair_with_bool_second_v就是干这个用的。直接用变量模板就能快速判断:
// 示例:判断std::pair<int, bool>是否符合条件 static_assert(is_pair_with_bool_second_v<std::pair<int, bool>> == true); // 示例:判断std::pair<std::string, bool>是否符合条件 static_assert(is_pair_with_bool_second_v<std::pair<std::string, bool>> == true); // 示例:判断std::pair<int, int>是否符合条件 static_assert(is_pair_with_bool_second_v<std::pair<int, int>> == false);
内容的提问来源于stack exchange,提问作者Chuanwise
相关产品推荐
相关产品推荐

