【问题标题】:Get function arity from template parameter从模板参数获取函数arity
【发布时间】: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 和其他类(取 decltypeoperator() 和然后做同样的事情)。如果operator() 过载,那你就倒霉了。
  • @Brian 略多于两个。 13 或 26,这取决于您是否想使用 C 风格的可变参数函数。

标签: c++ function c++11 c++14 arity


【解决方案1】:

假设我们讨论的所有operator() 和函数都不是模板或重载:

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

Demo.

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多