判断类是否有成员或者是有成员函数的技巧
1. 判断类是否有成员或者是有成员函数的技巧
template <typename T, typename F>
constexpr auto has_member_impl(F&& f) -> decltype(f(std::declval<T>()), true)
{
return true;
}
template <typename>
constexpr bool has_member_impl(...)
{
return false;
}
template <typename T>
#define has_member(T, EXPR) has_member_impl<T>([](auto&& obj) -> decltype(obj.EXPR) {})
2. 使用场景
assert_t(has_member(std::vector<int>, size()))
3. 类型推导
3.1 宏展开
detail::has_member_impl<std::vector<int>>(
[](auto&& obj) -> decltype(obj.size()) {}
)
3.2 Lambda表达式部分
[](auto&& obj) -> decltype(obj.size()) {}
这是一个泛型lambda,接受任意类型的参数 obj
返回类型是 decltype(obj.size()) - 即 obj.size() 的返回类型
lambda体为空 {}
3.3 调用解析成功过程
当调用 detail::has_member_impl<std::vector
// 1.尝试调用第一个重载
f(std::declval<std::vector<int>>()) // 将lambda应用于vector<int>的右值引用
// 2.lambda内部:
[](auto&& obj) -> decltype(obj.size()) {}
// obj 被推导为 std::vector<int>&&
// decltype(obj.size()) 是有效的,因为vector有size()方法
// 返回类型推导成功
// 3.因此 decltype(f(std::declval<T>()), true) 是有效的
// 选择第一个重载,返回 true

浙公网安备 33010602011771号