C++ 如何根据函数对象的arity(或编译时已知的其他信息)以不同的方式调用函数对象?
在函数模板中,我希望根据函数的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>
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(…)调度(第二种功能类型)。。。