로딩중...
검색중...
일치하는것 없음
to.hpp
이 파일의 문서화 페이지로 가기
1
4#pragma once
5
6#include "indep/macro/overload.hpp"
8#include <vector>
9#include <type_traits>
10
11namespace by {
12
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);
15 else return f(t);
16 }
17
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);
20 else return f(t);
21 }
22
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);
25 else return f(t);
26 }
27
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();
31 }
32
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();
36 }
37
175#define TO(fn) \
176 ->*[&](auto&& __p) -> decltype(__p.fn) { \
177 return __p.fn; \
178 }
179
180} // namespace by