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