1#ifndef NEFORCE_CORE_REFLECT_FUNCTION_HPP__
2#define NEFORCE_CORE_REFLECT_FUNCTION_HPP__
14NEFORCE_BEGIN_NAMESPACE__
15NEFORCE_BEGIN_REFLECT__
66 return invoker_(
move(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>
117 return (obj->*func)(args[Is].template convert<Args>()...);
121decltype(
auto) make_member_invoker(Ret (Class::*func)(Args...)) {
123 if (
sizeof...(Args) != args.
size()) {
126 inner::invoke_impl(
static_cast<Class*
>(obj), func, args,
make_index_sequence<
sizeof...(Args)>{});
127 return reflect::meta_any{};
132decltype(
auto) make_member_invoker(Ret (Class::*func)(Args...)) {
134 if (
sizeof...(Args) != args.
size()) {
137 auto result = inner::invoke_impl(
static_cast<Class*
>(obj), func, args,
make_index_sequence<
sizeof...(Args)>{});
138 return reflect::meta_any(result);
143decltype(
auto) make_const_member_invoker(Ret (Class::*func)(Args...)
const) {
145 if (
sizeof...(Args) != args.
size()) {
148 inner::invoke_impl(
static_cast<const Class*
>(obj), func, args,
make_index_sequence<
sizeof...(Args)>{});
149 return reflect::meta_any{};
154decltype(
auto) make_const_member_invoker(Ret (Class::*func)(Args...)
const) {
156 if (
sizeof...(Args) != args.
size()) {
160 inner::invoke_impl(
static_cast<const Class*
>(obj), func, args,
make_index_sequence<
sizeof...(Args)>{});
161 return reflect::meta_any(result);
166decltype(
auto) make_static_invoker(Ret (*func)(Args...)) {
168 if (
sizeof...(Args) != args.
size()) {
171 auto result = inner::invoke_impl(
nullptr, func, args,
make_index_sequence<
sizeof...(Args)>{});
172 return reflect::meta_any(result);
177decltype(
auto) make_static_invoker(Ret (*func)(Args...)) {
179 if (
sizeof...(Args) != args.
size()) {
182 auto result = inner::invoke_impl(
nullptr, func, args,
make_index_sequence<
sizeof...(Args)>{});
183 return reflect::meta_any(result);
189NEFORCE_END_NAMESPACE__
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的便捷别名