C++ 从模板参数获取函数arity

C++ 从模板参数获取函数arity,c++,function,c++11,c++14,arity,C++,Function,C++11,C++14,Arity,如何获得用作模板参数的任意函数类型的arity 函数可以是正规函数、lambda函数或函子。例如: template<typename TFunc> std::size_t getArity() { // ...? } template<typename TFunc> void printArity(TFunc mFunc) { std::cout << "arity: " << getArity<TFunc>()

如何获得用作模板参数的任意函数类型的arity

函数可以是正规函数、lambda函数或函子。例如:

template<typename TFunc>
std::size_t getArity() 
{
    // ...? 
}

template<typename TFunc>
void printArity(TFunc mFunc)
{
    std::cout << "arity: " << getArity<TFunc>() << std::endl;
}

void testFunc(int) { }

int main()
{
    printArity([](){}); // prints 0
    printArity([&](int x, float y){}); // prints 2
    printArity(testFunc); // prints 1
}
模板
std::size\u t getArity()
{
// ...? 
}
模板
无效打印性(TFunc mFunc)
{

std::cout假设我们讨论的所有
操作符()和函数都不是模板或重载:

template <typename T>
struct get_arity : get_arity<decltype(&T::operator())> {};
template <typename R, typename... Args>
struct get_arity<R(*)(Args...)> : std::integral_constant<unsigned, sizeof...(Args)> {};
// Possibly add specialization for variadic functions
// Member functions:
template <typename R, typename C, typename... Args>
struct get_arity<R(C::*)(Args...)> :
    std::integral_constant<unsigned, sizeof...(Args)> {};
template <typename R, typename C, typename... Args>
struct get_arity<R(C::*)(Args...) const> :
    std::integral_constant<unsigned, sizeof...(Args)> {};

// Add all combinations of variadic/non-variadic, cv-qualifiers and ref-qualifiers
模板
结构get_arity:get_arity{};
模板
结构get_arity:std::integral_常量{};
//可能添加变量函数的特殊化
//成员职能:
模板
结构获取单元:
积分常数{};
模板
结构获取单元:
积分常数{};
//添加可变/非可变、cv限定符和ref限定符的所有组合

.

你对变量泛型lambda的算术性定义是什么?或者对具有多个重载
运算符()
s的函子的算术性定义是什么?可能的重复只需要两个重载:一个用于函数指针(简单,只需在推导的参数包上使用
sizeof…
)一个用于lambda和其他类(取其
操作符()
decltype
,然后做同样的事情)
过载,你就倒霉了。@Brian略多于两个.13或26,这取决于你是否想使用C风格的varargs函数。看看:有没有像你这样的版本也支持通用lambda?