Initial commit

This commit is contained in:
gaztin committed 2026-07-11 19:53:00 +02:00
commit d1890b6e18
16 files changed
+702

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
#pragma once
#include <concepts>
namespace core {
template<typename T>
concept callable = requires { &T::operator(); };
template<typename T>
struct function_traits
{
using return_type = void;
using first_argument_type = void;
};
template<typename T>
requires callable<T>
struct function_traits<T>
{
using return_type = typename function_traits<decltype(&T::operator())>::return_type;
using first_argument_type = typename function_traits<decltype(&T::operator())>::first_argument_type;
};
template<typename Ret, typename Arg0, typename... Args>
struct function_traits<Ret(Arg0, Args...)>
{
using return_type = typename Ret;
using first_argument_type = typename Arg0;
};
template<typename Ret, typename Arg0, typename... Args>
struct function_traits<Ret (*)(Arg0, Args...)>
{
using return_type = typename Ret;
using first_argument_type = typename Arg0;
};
template<typename Ret, typename Class, typename Arg0, typename... Args>
struct function_traits<Ret (Class::*)(Arg0, Args...)>
{
using return_type = typename Ret;
using first_argument_type = typename Arg0;
};
template<typename Ret, typename Class, typename Arg0, typename... Args>
struct function_traits<Ret (Class::*)(Arg0, Args...) const>
{
using return_type = typename Ret;
using first_argument_type = typename Arg0;
};
template<typename T>
using return_type_t = typename function_traits<T>::return_type;
template<typename T>
using first_argument_type_t = typename function_traits<T>::first_argument_type;
template<typename T, typename Arg>
concept callable_with_converted_argument = requires(T&& callable, Arg&& arg) { callable(typename traits::first_argument_type_t<T>{arg}); };
}