1

在函数模板中,我想以不同的方式调用函数或函数对象,具体取决于它的数量(它需要多少个参数)。在伪代码中:

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 个参数,则不会编译,反之亦然,需要 3 个参数f(x, y)时不会编译。f

4

1 回答 1

2

使用 C++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

于 2014-01-25T10:36:32.080 回答