6#include "indep/macro/overload.hpp"
13 template <
typename T,
typename F>
auto operator->*(T& t, F&& f) {
14 if constexpr(std::is_reference_v<
decltype(f(t))>)
return &f(t);
18 template <
typename T,
typename F>
auto operator->*(
const T& t, F&& f) {
19 if constexpr(std::is_reference_v<
decltype(f(t))>)
return &f(t);
23 template <
typename T,
typename F>
auto operator->*(T&& t, F&& f) {
24 if constexpr(std::is_reference_v<
decltype(f(t))>)
return &f(t);
28 template <
typename T,
typename F>
auto operator->*(T* t, F&& f) {
29 if constexpr(std::is_reference_v<
decltype(f(*t))>)
return t ? &f(*t) : typeTrait<decltype(&f(*t))>::ret();
30 else return t ? f(*t) : typeTrait<decltype(f(*t))>::ret();
33 template <
typename T,
typename F>
auto operator->*(
const T* t, F&& f) {
34 if constexpr(std::is_reference_v<
decltype(f(*t))>)
return t ? &f(*t) : typeTrait<decltype(&f(*t))>::ret();
35 else return t ? f(*t) : typeTrait<decltype(f(*t))>::ret();
176 ->*[&](auto&& __p) -> decltype(__p.fn) { \