to.hpp
Go to the documentation of this file.
1
3#pragma once
4
5#include "indep/macro/overload.hpp"
7#include <vector>
8#include <type_traits>
9
10namespace by {
11
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);
14 else return f(t);
15 }
16
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);
19 else return f(t);
20 }
21
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);
24 else return f(t);
25 }
26
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();
30 }
31
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();
35 }
36
170
171#define TO(fn) \
172 ->*[&](auto&& __p) -> decltype(__p.fn) { \
173 return __p.fn; \
174 }
175
176} // namespace by