Как вызывать объект функции по-разному, в зависимости от его арности (или другой информации, известной во время компиляции)?

В шаблоне функции я бы хотел вызывать функцию или объект функции по-разному, в зависимости от его арности (сколько аргументов требуется). В псевдокоде:

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

Другие решения

Других решений пока нет …