#pragma once #include #include namespace ztu { template concept callable = std::same_as, R>; template concept runnable = callable; template concept supplier = callable; template concept consumer = callable; template concept predicate = callable; template struct function_meta; template struct function_meta { using ret_t = R; using args_t = std::tuple; static constexpr bool is_const = false; }; template struct function_meta { using class_t = C; using ret_t = R; using args_t = std::tuple; static constexpr bool is_const = false; }; template struct function_meta { using class_t = C; using ret_t = R; using args_t = std::tuple; static constexpr bool is_const = true; }; namespace function { template using class_t = typename function_meta::class_t; template using ret_t = typename function_meta::ret_t; template using args_t = typename function_meta::args_t; template constexpr bool is_const_v = function_meta::is_const; } }