判断类是否有成员或者是有成员函数的技巧

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>(lambda)

// 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
posted @ 2026-08-24 16:56  Robertlin_Martin  阅读(5)  评论(0)    收藏  举报