diff --git a/include/chaiscript/dispatchkit/callable_traits.hpp b/include/chaiscript/dispatchkit/callable_traits.hpp index 9954eea..cc1b2e7 100644 --- a/include/chaiscript/dispatchkit/callable_traits.hpp +++ b/include/chaiscript/dispatchkit/callable_traits.hpp @@ -61,6 +61,17 @@ namespace chaiscript { Ret (Class::*m_func)(Param...); }; + template + struct Arity + { + }; + + template + struct Arity + { + static const size_t arity = sizeof...(Params); + }; + template struct Function_Signature diff --git a/include/chaiscript/dispatchkit/function_call.hpp b/include/chaiscript/dispatchkit/function_call.hpp index 3c8e3c5..5692e34 100644 --- a/include/chaiscript/dispatchkit/function_call.hpp +++ b/include/chaiscript/dispatchkit/function_call.hpp @@ -14,6 +14,7 @@ #include "boxed_cast.hpp" #include "function_call_detail.hpp" #include "proxy_functions.hpp" +#include "callable_traits.hpp" namespace chaiscript { class Boxed_Value; @@ -37,6 +38,15 @@ namespace chaiscript std::function functor(const std::vector &funcs, const Type_Conversions *t_conversions) { + const bool has_arity_match = std::any_of(funcs.begin(), funcs.end(), + [](const Const_Proxy_Function &f) { + return f->get_arity() == -1 || f->get_arity() == chaiscript::dispatch::detail::Arity::arity; + }); + + if (!has_arity_match) { + throw exception::bad_boxed_cast(user_type(), typeid(std::function)); + } + FunctionType *p=nullptr; return detail::build_function_caller_helper(p, funcs, t_conversions); }