1#ifndef NEFORCE_CORE_REFLECT_FUNCTION_HPP__
2#define NEFORCE_CORE_REFLECT_FUNCTION_HPP__
14NEFORCE_BEGIN_NAMESPACE__
15NEFORCE_BEGIN_REFLECT__
66 return invoker_(obj, args);
83 NEFORCE_NODISCARD
size_t min_args()
const {
return min_args_; }
89 NEFORCE_NODISCARD
size_t max_args()
const {
return max_args_; }
108template <
typename Ret,
typename Class,
typename... Args,
size_t... Is>
111 return (obj->*func)(args[Is].template convert<Args>()...);
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...> ) {
117 return (obj->*func)(args[Is].template convert<Args>()...);
120template <
typename Ret,
typename... Args,
size_t... Is>
121Ret invoke_impl(Ret (*func)(Args...),
const vector<reflect::meta_any>& args, index_sequence<Is...> ) {
122 return (*func)(args[Is].template convert<Args>()...);
125template <
typename Ret,
typename Class,
typename... Args, enable_if_t<is_void_v<Ret>,
int> = 0>
126decltype(
auto) make_member_invoker(Ret (Class::*func)(Args...)) {
127 return [func](
void* obj,
const vector<reflect::meta_any>& args) -> reflect::meta_any {
128 if (
sizeof...(Args) != args.size()) {
129 NEFORCE_THROW_EXCEPTION(value_exception(
"Argument count mismatch"));
131 inner::invoke_impl(
static_cast<Class*
>(obj), func, args, make_index_sequence<
sizeof...(Args)>{});
132 return reflect::meta_any{};
136template <
typename Ret,
typename Class,
typename... Args, enable_if_t<!is_void_v<Ret>,
int> = 0>
137decltype(
auto) make_member_invoker(Ret (Class::*func)(Args...)) {
138 return [func](
void* obj,
const vector<reflect::meta_any>& args) -> reflect::meta_any {
139 if (
sizeof...(Args) != args.size()) {
140 NEFORCE_THROW_EXCEPTION(value_exception(
"Argument count mismatch"));
142 auto result = inner::invoke_impl(
static_cast<Class*
>(obj), func, args, make_index_sequence<
sizeof...(Args)>{});
143 return reflect::meta_any(result);
147template <
typename Ret,
typename Class,
typename... Args, enable_if_t<is_void_v<Ret>,
int> = 0>
148decltype(
auto) make_const_member_invoker(Ret (Class::*func)(Args...)
const) {
149 return [func](
void* obj,
const vector<reflect::meta_any>& args) -> reflect::meta_any {
150 if (
sizeof...(Args) != args.size()) {
151 NEFORCE_THROW_EXCEPTION(value_exception(
"Argument count mismatch"));
153 inner::invoke_impl(
static_cast<const Class*
>(obj), func, args, make_index_sequence<
sizeof...(Args)>{});
154 return reflect::meta_any{};
158template <
typename Ret,
typename Class,
typename... Args, enable_if_t<!is_void_v<Ret>,
int> = 0>
159decltype(
auto) make_const_member_invoker(Ret (Class::*func)(Args...)
const) {
160 return [func](
void* obj,
const vector<reflect::meta_any>& args) -> reflect::meta_any {
161 if (
sizeof...(Args) != args.size()) {
162 NEFORCE_THROW_EXCEPTION(value_exception(
"Argument count mismatch"));
165 inner::invoke_impl(
static_cast<const Class*
>(obj), func, args, make_index_sequence<
sizeof...(Args)>{});
166 return reflect::meta_any(result);
170template <
typename Ret,
typename... Args, enable_if_t<is_void_v<Ret>,
int> = 0>
171decltype(
auto) make_static_invoker(Ret (*func)(Args...)) {
172 return [func](
void*,
const vector<reflect::meta_any>& args) -> reflect::meta_any {
173 if (
sizeof...(Args) != args.size()) {
174 NEFORCE_THROW_EXCEPTION(value_exception(
"Argument count mismatch"));
176 inner::invoke_impl(func, args, make_index_sequence<
sizeof...(Args)>{});
177 return reflect::meta_any{};
181template <
typename Ret,
typename... Args, enable_if_t<!is_void_v<Ret>,
int> = 0>
182decltype(
auto) make_static_invoker(Ret (*func)(Args...)) {
183 return [func](
void*,
const vector<reflect::meta_any>& args) -> reflect::meta_any {
184 if (
sizeof...(Args) != args.size()) {
185 NEFORCE_THROW_EXCEPTION(value_exception(
"Argument count mismatch"));
187 auto result = inner::invoke_impl(func, args, make_index_sequence<
sizeof...(Args)>{});
188 return reflect::meta_any(result);
194NEFORCE_END_NAMESPACE__
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
integer_sequence< size_t, Values... > 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
字符字符串视图