C++ 如何根据函数对象的arity(或编译时已知的其他信息)以不同的方式调用函数对象?

C++ 如何根据函数对象的arity(或编译时已知的其他信息)以不同的方式调用函数对象?,c++,template-meta-programming,arity,C++,Template Meta Programming,Arity,在函数模板中,我希望根据函数的arity(需要多少个参数)以不同的方式调用函数或函数对象。在伪代码中: 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)如果只接受2个参数,则不会编译,反之亦然,f(x,y)如果需要3个参数,则不会编译。使用C++11: #include <iostream>

在函数模板中,我希望根据函数的arity(需要多少个参数)以不同的方式调用函数或函数对象。在伪代码中:

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

使用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;
}
#包括
模板结构特征;
模板
结构特征
{
static constexpr unsigned Arity=sizeof…(A);
};
无效f(int,int,int);
int main(){
标准::cout

将参数
x,y,z
放入一个元组,并基于arity扩展该元组(参见Dieter Lückg关于如何获得arity的答案)。令人印象深刻,但您的示例没有调用
f
@MaxB当然-您需要一个调用f的调度机制-它不能是if(…)调度(first_function_type),否则if(…)调度(第二种功能类型)。。。