NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
reflect/function.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_REFLECT_FUNCTION_HPP__
2#define NEFORCE_CORE_REFLECT_FUNCTION_HPP__
3
10
14NEFORCE_BEGIN_NAMESPACE__
15NEFORCE_BEGIN_REFLECT__
16
22
30public:
31 using invoker = function<meta_any(void*, const vector<meta_any>&)>;
32
33private:
34 string_view name_;
35 invoker invoker_;
36 size_t min_args_ = 0;
37 size_t max_args_ = 0;
38
39public:
46 name_(name),
47 invoker_(move(invoker)) {}
48
53 NEFORCE_NODISCARD string_view name() const noexcept { return name_; }
54
61 meta_any invoke(void* obj, const vector<meta_any>& args) const {
62 if (!invoker_) {
63 return meta_any{};
64 }
65 try {
66 return invoker_(move(obj), args);
67 } catch (...) {
68 return meta_any{};
69 }
70 }
71
77 meta_any invoke(void* obj) const { return invoke(obj, {}); }
78
83 NEFORCE_NODISCARD size_t min_args() const { return min_args_; }
84
89 NEFORCE_NODISCARD size_t max_args() const { return max_args_; }
90
96 void set_arg_hints(size_t min, size_t max) {
97 min_args_ = min;
98 max_args_ = max;
99 }
100};
101 // Reflection
103
104NEFORCE_END_REFLECT__
105
106NEFORCE_BEGIN_INNER__
107
108template <typename Ret, typename Class, typename... Args, size_t... Is>
109Ret invoke_impl(Class* obj, Ret (Class::*func)(Args...), const vector<reflect::meta_any>& args,
110 index_sequence<Is...> /*unused*/) {
111 return (obj->*func)(args[Is].template convert<Args>()...);
112}
113
114template <typename Ret, typename Class, typename... Args, size_t... Is>
115Ret invoke_impl(const Class* obj, Ret (Class::*func)(Args...) const, const vector<reflect::meta_any>& args,
116 index_sequence<Is...> /*unused*/) {
117 return (obj->*func)(args[Is].template convert<Args>()...);
118}
119
120template <typename Ret, typename Class, typename... Args, enable_if_t<is_void_v<Ret>, int> = 0>
121decltype(auto) make_member_invoker(Ret (Class::*func)(Args...)) {
122 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
123 if (sizeof...(Args) != args.size()) {
124 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
125 }
126 inner::invoke_impl(static_cast<Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
127 return reflect::meta_any{};
128 };
129}
130
131template <typename Ret, typename Class, typename... Args, enable_if_t<!is_void_v<Ret>, int> = 0>
132decltype(auto) make_member_invoker(Ret (Class::*func)(Args...)) {
133 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
134 if (sizeof...(Args) != args.size()) {
135 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
136 }
137 auto result = inner::invoke_impl(static_cast<Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
138 return reflect::meta_any(result);
139 };
140}
141
142template <typename Ret, typename Class, typename... Args, enable_if_t<is_void_v<Ret>, int> = 0>
143decltype(auto) make_const_member_invoker(Ret (Class::*func)(Args...) const) {
144 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
145 if (sizeof...(Args) != args.size()) {
146 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
147 }
148 inner::invoke_impl(static_cast<const Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
149 return reflect::meta_any{};
150 };
151}
152
153template <typename Ret, typename Class, typename... Args, enable_if_t<!is_void_v<Ret>, int> = 0>
154decltype(auto) make_const_member_invoker(Ret (Class::*func)(Args...) const) {
155 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
156 if (sizeof...(Args) != args.size()) {
157 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
158 }
159 auto result =
160 inner::invoke_impl(static_cast<const Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
161 return reflect::meta_any(result);
162 };
163}
164
165template <typename Ret, typename... Args, enable_if_t<is_void_v<Ret>, int> = 0>
166decltype(auto) make_static_invoker(Ret (*func)(Args...)) {
167 return [func](void*, const vector<reflect::meta_any>& args) -> reflect::meta_any {
168 if (sizeof...(Args) != args.size()) {
169 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
170 }
171 auto result = inner::invoke_impl(nullptr, func, args, make_index_sequence<sizeof...(Args)>{});
172 return reflect::meta_any(result);
173 };
174}
175
176template <typename Ret, typename... Args, enable_if_t<!is_void_v<Ret>, int> = 0>
177decltype(auto) make_static_invoker(Ret (*func)(Args...)) {
178 return [func](void*, const vector<reflect::meta_any>& args) -> reflect::meta_any {
179 if (sizeof...(Args) != args.size()) {
180 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
181 }
182 auto result = inner::invoke_impl(nullptr, func, args, make_index_sequence<sizeof...(Args)>{});
183 return reflect::meta_any(result);
184 };
185}
186
187NEFORCE_END_INNER__
188
189NEFORCE_END_NAMESPACE__
190#endif // NEFORCE_CORE_REFLECT_FUNCTION_HPP__
函数包装器主模板声明
类型擦除容器
string_view name() const noexcept
获取函数名称
meta_any invoke(void *obj, const vector< meta_any > &args) const
调用函数
meta_function(string_view name, invoker invoker)
构造函数
meta_any invoke(void *obj) const
调用无参函数
void set_arg_hints(size_t min, size_t max)
设置参数数量提示
size_t max_args() const
获取最大参数数量
function< meta_any(void *, const vector< meta_any > &)> invoker
函数调用器类型
size_t min_args() const
获取最小参数数量
动态大小数组容器
constexpr size_type size() const noexcept
获取当前元素数量
通用函数包装器
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
integer_sequence< size_t, Values... > index_sequence
索引序列
make_integer_sequence< size_t, Size > make_index_sequence
生成指定长度的索引序列
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
类型擦除容器
变量处理异常
动态大小数组容器