В шаблоне функции я бы хотел вызывать функцию или объект функции по-разному, в зависимости от его арности (сколько аргументов требуется). В псевдокоде:
if arity(f) == 1:
f(x)
if arity(f) == 2:
f(x, y)
if arity(f) == 3:
f(x, y, z)
Как это можно сделать в C ++?
редактировать Чтобы уточнить сложность: f(x, y, z)
не скомпилируется, если f
принимает только 2 аргумента и наоборот, f(x, y)
не скомпилируется когда f
нужно 3 аргумента.
1
Решение
С С ++ 11:
#include <iostream>
template <typename F> struct Traits;
template <typename R, typename... A>
struct Traits<R (A...)>
{
static constexpr unsigned Arity = sizeof...(A);
};
void f(int, int, int);
int main() {
std::cout
<< Traits<void()>::Arity
<< Traits<void(int)>::Arity
<< Traits<void(int, int)>::Arity
<< Traits<decltype(f)>::Arity
<< '\n';
return 0;
}
В противном случае вы можете посмотреть boost :: function: http://www.boost.org/doc/libs/1_55_0b1/doc/html/function.html
2
Другие решения
Других решений пока нет …