5#include "indep/macro/overload.hpp"
12 template <
typename T,
typename F>
auto operator->*(T& t, F&& f) {
13 if constexpr(std::is_reference_v<
decltype(f(t))>)
return &f(t);
17 template <
typename T,
typename F>
auto operator->*(
const T& t, F&& f) {
18 if constexpr(std::is_reference_v<
decltype(f(t))>)
return &f(t);
22 template <
typename T,
typename F>
auto operator->*(T&& t, F&& f) {
23 if constexpr(std::is_reference_v<
decltype(f(t))>)
return &f(t);
27 template <
typename T,
typename F>
auto operator->*(T* t, F&& f) {
28 if constexpr(std::is_reference_v<
decltype(f(*t))>)
return t ? &f(*t) : typeTrait<decltype(&f(*t))>::ret();
29 else return t ? f(*t) : typeTrait<decltype(f(*t))>::ret();
32 template <
typename T,
typename F>
auto operator->*(
const T* t, F&& f) {
33 if constexpr(std::is_reference_v<
decltype(f(*t))>)
return t ? &f(*t) : typeTrait<decltype(&f(*t))>::ret();
34 else return t ? f(*t) : typeTrait<decltype(f(*t))>::ret();
172 ->*[&](auto&& __p) -> decltype(__p.fn) { \