Получение количества аргументов указателя функции - PullRequest
8 голосов
/ 27 декабря 2011

Я сейчас использую этот код:

    size_t argc(std::function<Foo()>)
    { return 0; }

    size_t argc(std::function<Foo(Bar)>)
    { return 1; }

    size_t argc(std::function<Foo(Bar, Bar)>)
    { return 2; }

    size_t argc(std::function<Foo(Bar, Bar, Bar)>)
    { return 3; }

    // ...

Но это уродливо и ограниченно (пользователь не может вызвать argc с функцией с любым количеством аргументов.) Есть ли лучший способ сделать это?

Примечание: тип возвращаемого значения и тип аргумента всегда одинаковы. Я знаю, что могу использовать шаблоны для принятия любого типа, но мне это не нужно.

Ответы [ 2 ]

12 голосов
/ 27 декабря 2011

Более чистая версия ответа @ Паоло, применима к реальным объектам:

template<class R, class... Args>
constexpr unsigned arity(std::function<R(Args...)> const&){
  return sizeof...(Args);
}
5 голосов
/ 27 декабря 2011

Следующее будет работать для любой арности, но принимать произвольные типы аргументов:

template <typename T>
struct arity
{
};

template <typename... Args>
struct arity<std::function<Foo(Args...)>>
{
    static const int value = sizeof...(Args);
};

Если вы действительно хотите ограничить ваш тип аргумента функциями типа Foo(Bar, Bar, ...), то вы можете сделать что-то вродеthis:

template <typename T>
struct arity
{
};

template <typename... Args>
struct const_tuple
{
};

template <>
struct const_tuple<>
{
    struct unsupported_function_type { };
};

template <typename... Args>
struct const_tuple<Bar, Args...>
{
    typedef typename const_tuple<Args...>::unsupported_function_type unsupported_function_type;
};

template <typename... Args>
struct arity<std::function<Foo(Args...)>> : public const_tuple<Args...>::unsupported_function_type
{
    static const int value = sizeof...(Args);
};

Это даст вам ошибку компиляции всякий раз, когда вызывается arity с неподдерживаемым типом функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...