UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
HasMemberFunction.hpp
[詳解]
1//
2// メンバ関数の有無を判定し、存在する場合は呼び出す関数
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
10#include <type_traits>
11
12#include "Typedef.hpp"
13
14namespace Udon
15{
16 namespace Traits
17 {
19 template <typename, typename = void>
20 struct HasMemberFunctionBegin : std::false_type
21 {
22 };
23 template <typename T>
24 struct HasMemberFunctionBegin<T, std::void_t<decltype(&T::begin)>> : std::is_member_function_pointer<decltype(&T::begin)>
25 {
26 };
27
29 template <typename HasMemberFunctionBegin, typename std::enable_if<Traits::HasMemberFunctionBegin<HasMemberFunctionBegin>::value, std::nullptr_t>::type = nullptr>
31 {
32 rhs.begin();
33 }
34
36 template <typename HasMemberFunctionBegin, typename std::enable_if<not Traits::HasMemberFunctionBegin<HasMemberFunctionBegin>::value, std::nullptr_t>::type = nullptr>
37 void MaybeInvokeBegin(HasMemberFunctionBegin&)
38 {
39 // Do nothing.
40 }
41 } // namespace Traits
42
43 namespace Traits
44 {
46 template <typename, typename = void>
47 struct HasMemberFunctionShow : std::false_type
48 {
49 };
50 template <typename T>
51 struct HasMemberFunctionShow<T, std::void_t<decltype(&T::show)>> : std::is_member_function_pointer<decltype(&T::show)>
52 {
53 };
54
56 template <typename HasMemberFunctionShow, typename std::enable_if<Traits::HasMemberFunctionShow<HasMemberFunctionShow>::value, std::nullptr_t>::type = nullptr>
58 {
59 rhs.show();
60 }
61
63 template <typename HasMemberFunctionShow, typename std::enable_if<not Traits::HasMemberFunctionShow<HasMemberFunctionShow>::value, std::nullptr_t>::type = nullptr>
64 void MaybeInvokeShow(const HasMemberFunctionShow&)
65 {
66 // Do nothing.
67 }
68 } // namespace Traits
69
70 namespace Traits
71 {
73 template <typename, typename = void>
74 struct HasMemberFunctionShowRaw : std::false_type
75 {
76 };
77 template <typename T>
78 struct HasMemberFunctionShowRaw<T, std::void_t<decltype(&T::showRaw)>> : std::is_member_function_pointer<decltype(&T::showRaw)>
79 {
80 };
81
83 template <typename HasMemberFunctionShowRaw, typename std::enable_if<Traits::HasMemberFunctionShowRaw<HasMemberFunctionShowRaw>::value, std::nullptr_t>::type = nullptr>
85 {
86 rhs.showRaw();
87 }
88
90 template <typename HasMemberFunctionShowRaw, typename std::enable_if<not Traits::HasMemberFunctionShowRaw<HasMemberFunctionShowRaw>::value, std::nullptr_t>::type = nullptr>
91 void MaybeInvokeShowRaw(const HasMemberFunctionShowRaw&)
92 {
93 // Do nothing.
94 }
95 } // namespace Traits
96
97 namespace Traits
98 {
100 template <typename, typename = void>
101 struct HasMemberFunctionUpdate : std::false_type
102 {
103 };
104 template <typename T>
105 struct HasMemberFunctionUpdate<T, std::void_t<decltype(&T::update)>> : std::is_member_function_pointer<decltype(&T::update)>
106 {
107 };
108
110 template <typename HasMemberFunctionUpdate, typename std::enable_if<Traits::HasMemberFunctionUpdate<HasMemberFunctionUpdate>::value, std::nullptr_t>::type = nullptr>
112 {
113 rhs.update();
114 }
115
117 template <typename HasMemberFunctionUpdate, typename std::enable_if<not Traits::HasMemberFunctionUpdate<HasMemberFunctionUpdate>::value, std::nullptr_t>::type = nullptr>
118 void MaybeInvokeUpdate(HasMemberFunctionUpdate&)
119 {
120 // Do nothing.
121 }
122 } // namespace Traits
123
124 namespace Traits
125 {
126
128 {
129 using ResultType = void;
130 };
131
133 template <typename T, typename = void>
134 struct HasMemberFunctionEnumerate : std::false_type
135 {
136 };
137
138 template <typename T>
139 struct HasMemberFunctionEnumerate<T, typename std::enable_if<
140 std::is_same<decltype(std::declval<T>().enumerate(std::declval<DummyEnumerator&>())), typename DummyEnumerator::ResultType>::value // enumerate(f) が存在するか, かつ戻り値が ResultType かどうか
141 >::type>
142 : std::true_type
143 {
144 };
145
146 template <typename OutputStream, typename T, typename = void>
147 struct IsOutputStreamable : std::false_type
148 {
149 };
150
151 template <typename OutputStream, typename T>
152 struct IsOutputStreamable<OutputStream, T, std::void_t<decltype(std::declval<OutputStream&>() << std::declval<T>())>> // operator<<(Stream&, T) が存在するか, かつ戻り値が Stream& かどうか
153 : std::true_type
154 {
155 };
156 } // namespace Traits
157
158} // namespace Udon
void MaybeInvokeShow(const HasMemberFunctionShow &rhs)
T に T::show const 関数が存在する場合呼び出す。それ以外の場合何もしない。
Definition HasMemberFunction.hpp:57
void MaybeInvokeBegin(HasMemberFunctionBegin &rhs)
T に T::begin 関数が存在する場合呼び出す。それ以外の場合何もしない。
Definition HasMemberFunction.hpp:30
void MaybeInvokeUpdate(HasMemberFunctionUpdate &rhs)
T に T::update 関数が存在する場合呼び出す。それ以外の場合何もしない。
Definition HasMemberFunction.hpp:111
void MaybeInvokeShowRaw(const HasMemberFunctionShowRaw &rhs)
T に T::showRaw const 関数が存在する場合呼び出す。それ以外の場合何もしない。
Definition HasMemberFunction.hpp:84
Definition Bit.hpp:12
Definition Typedef.hpp:94
Definition HasMemberFunction.hpp:128
void ResultType
Definition HasMemberFunction.hpp:129
T に T::begin 関数が存在するか
Definition HasMemberFunction.hpp:21
T に enumerate(f) が存在するかどうかを判定する
Definition HasMemberFunction.hpp:135
T に T::showRaw 関数が存在するか
Definition HasMemberFunction.hpp:75
T に T::show 関数が存在するか
Definition HasMemberFunction.hpp:48
T に T::update 関数が存在するか
Definition HasMemberFunction.hpp:102
Definition HasMemberFunction.hpp:148