12 #ifndef EMP_FLEX_FUNCTION_H 13 #define EMP_FLEX_FUNCTION_H 18 #include "../base/assert.h" 19 #include "../meta/meta.h" 27 template <
class R,
class... ARGS>
30 using size_t = std::size_t;
32 using fun_t = std::function<R(ARGS...)>;
36 static constexpr
int num_args =
sizeof...(ARGS);
58 std::get<ID>(default_args) = in_default;
63 default_args = std::make_tuple(args...);
73 template <
class... IN_ARGS>
76 constexpr
int in_args =
sizeof...(IN_ARGS);
77 static_assert(in_args < num_args,
"This operator() should only be called if too few args provided.");
78 return operator()(std::forward<IN_ARGS>(k)..., std::get<in_args>(default_args));
82 operator bool()
const {
return (
bool) fun; }
Definition: flex_function.h:28
Definition: BitVector.h:785
return_t operator()(IN_ARGS &&...k) const
All the function to be called with a subset of arguments (and the rest set to defaults) ...
Definition: flex_function.h:74
R return_t
Definition: flex_function.h:31
this_t & operator=(T &&arg)
Definition: flex_function.h:54
this_t & operator=(fun_t &&_f)
Definition: flex_function.h:52
typename internal::pack_id_impl< ID, Ts... >::type pack_id
Definition: meta.h:40
this_t & operator=(const fun_t &_f)
Definition: flex_function.h:51
flex_function(T &&fun_info)
Definition: flex_function.h:44
If we are in emscripten, make sure to include the header.
Definition: array.h:37
void SetDefaults(ARGS...args)
Set the default values for all parameters.
Definition: flex_function.h:62
return_t operator()(ARGS...k) const
Allow the function to be called with all args.
Definition: flex_function.h:67
#define emp_assert(...)
Definition: assert.h:199
void SetDefault(pack_id< ID, ARGS... > &in_default)
Set the default value for a specific parameter.
Definition: flex_function.h:57
std::function< R(ARGS...)> fun_t
Definition: flex_function.h:32
std::tuple< ARGS... > tuple_t
Definition: flex_function.h:34
Definition: flex_function.h:23
flex_function()
Definition: flex_function.h:47