Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Количество аргументов функции

#cpp #cpp11 #шаблоны_с++


Недавно был вопрос о том, как объявить функцию с n аргументами заданного типа. У
меня возник противоположный вопрос. Как узнать количество аргументов функции?

#include 

void foo(float, int){

}

int main(){
    std::cout << doTemplateMagic(foo); //2
}

    


Ответы

Ответ 1



Boost.TypeTraits, например #include #include void f(int, char) {} int n = boost::function_traits>::arity;

Ответ 2



Можно использовать темплейт с переменным числом параметров: #include template constexpr size_t getArgumentCount( R(*f)(Types ...)) { return sizeof...(Types); } //---------------------------------- // Test it out with a few functions. //---------------------------------- void foo(int a, int b, int c) { } int bar() { return 0; } int baz(double) { return 0; } int main() { std::cout << getArgumentCount(foo) << std::endl; std::cout << getArgumentCount(bar) << std::endl; std::cout << getArgumentCount(baz) << std::endl; return 0; } Вывод: 3 0 1 Или использовать этот метод: template constexpr std::integral_constant getArgumentCount( R(*f)(Types ...)) { return std::integral_constant{}; } // Guaranteed to be evaluated at compile time size_t count = decltype(getArgumentCount(foo))::value; или // Most likely evaluated at compile time size_t count = getArgumentCount(foo).value; Источник: https://stackoverflow.com/questions/36797770/get-function-parameters-count

Ответ 3



Немного покритикую остальные ответы, приводя цитату: “Don't try to write helper code to detect PMFs/PMDs and dispatch on them -- it is an absolute nightmare. PMF types are the worst types by far in the core language.” Используйте Boost.CallableTraits #include #include namespace ct = boost::callable_traits; int main() { auto lamda = [](int, float&, const char*){}; using lam = decltype(lamda); static_assert(std::tuple_size_v> == 3); }

Комментариев нет:

Отправить комментарий