【发布时间】:2015-01-09 18:28:57
【问题描述】:
如何获得用作模板参数的任意函数类型的数量?
函数可以是普通函数、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
}
我可以使用所有 C++14 功能。
我是否必须为每个函数类型(以及所有相应的限定符)创建专门化? 还是有更简单的方法?
【问题讨论】:
-
你对可变参数泛型 lambda 的定义是什么?或者具有多个重载
operator ()s 的仿函数采用不同数量的参数? -
你只需要两个重载:一个用于函数指针(很简单,只需在推导的参数包上使用
sizeof...),另一个用于 lambda 和其他类(取decltype的operator()和然后做同样的事情)。如果operator()过载,那你就倒霉了。 -
@Brian 略多于两个。 13 或 26,这取决于您是否想使用 C 风格的可变参数函数。
标签: c++ function c++11 c++14 arity