namespace ov::helpers

namespace helpers {

// structs

template <typename T>
struct NumOfLambdaArgs;
template <typename C, typename R, typename... Args>
struct NumOfLambdaArgs<R(C::\*)(Args...) const>;

// global functions

template <typename ACT, typename... T, size_t N_ARGS = NumOfLambdaArgs<ACT>::value>
std::enable_if<N_ARGS==sizeof...(T)+2, void>::type call_with_args(
    const ACT& body,
    size_t g_id,
    size_t iwork,
    T... arg
    );

template <typename ACT, typename... T, size_t N_ARGS = NumOfLambdaArgs<ACT>::value>
std::enable_if<N_ARGS==sizeof...(T)+1, void>::type call_with_args(
    const ACT& body,
    size_t g_id,
    size_t iwork,
    T... arg
    );

template <typename ACT, typename... T, size_t N_ARGS = NumOfLambdaArgs<ACT>::value>
std::enable_if<N_ARGS==sizeof...(T), void>::type call_with_args(
    const ACT& body,
    size_t g_id,
    size_t iwork,
    T... arg
    );

} // namespace helpers