#pragma once #include namespace detail { template struct class_of; template struct class_of { using type = C; }; template using class_of_t = typename class_of::type; template> struct member_equals_fn_helper { T ref; Mem mem_fn; bool operator()(const C& val) const { return (std::mem_fn(mem_fn)(val) == ref); } bool operator()(C&& val) const { return (std::mem_fn(mem_fn)(std::move(val)) == ref); } }; } // namespace detail template auto member_equals_fn(Mem mem, T ref) { return detail::member_equals_fn_helper{std::move(ref), std::move(mem)}; }