查询lambda/函数的参数数
Query number of arguments from a lambda/function
我想查询lambda/函数,了解它使用了多少参数。小型(伪)示例代码:
template <class InputIterator, class Predicate>
bool visitAll( InputIterator f, InputIterator l, Predicate p, UserData* d=nullptr)
{
for(; f != l; ++f)
{
if(number_of_arguments(p) == 1)
{
if(!p(*f))
return false;
}
else
{
if(!p(*f, *d))
return false;
}
}
}
请注意,我要求的函数是number_of_arguments(...)
。我一直在Closure和std::函数引用中搜索,但没有找到关于解决方案的线索。
谢谢你的帮助!
显然,您发布的代码没有多大意义,因为无论如何,p(*f)
或p(*f, *d)
都无法编译。因此,您需要将其拆分为两个模板,然后可以使用一种相当简单的SFINAE方法来测试Predicate
的自变量数量:
template <class InputIterator, class Predicate>
bool visitAll( InputIterator f, InputIterator l, Predicate p, UserData* d=nullptr,
decltype(declval<Predicate>()(*declval<InputIterator>()),1) unused = 1)
{
cout << "1" << std::endl;
for(; f != l; ++f)
{
if(!p(*f))
return false;
}
return true;
}
template <class InputIterator, class Predicate>
bool visitAll( InputIterator f, InputIterator l, Predicate p, UserData* d=nullptr,
decltype(declval<Predicate>()(*declval<InputIterator>(), declval<UserData>()),1) unused = 1)
{
cout << "2" << std::endl;
for(; f != l; ++f)
{
if(!p(*f, *d))
return false;
}
return true;
}
用法:
std::vector<int> a{1,2};
const auto t = [](int x){ return 1;};
const auto t2 = [](int x, UserData y){ return 1;};
UserData d;
visitAll(a.begin(), a.end(), t);
visitAll(a.begin(), a.end(), t2, &d);
当然,您可以使用std::bind
通过从第二个版本调用第一个版本来避免代码重复。
另一种方法是使用类似于std::bind
检查是否获得所需数量的参数的代码:
template<typename _Func>
struct noa_helper {
};
template<typename _Ret, typename... _Args>
struct noa_helper<_Ret (*)(_Args...)> {
static int noa() { return sizeof...(_Args); }
};
template<class F>
int number_of_arguments(F f) {
return noa_helper<typename std::decay<F>::type>::noa();
}
void foo();
int bar(int x, int y);
...
std::cout << number_of_arguments(foo) << std::endl; // prints 0
std::cout << number_of_arguments(bar) << std::endl; // prints 2
这只适用于真正的函数,而不是lambdas或std::function
,尽管可能更多的模板魔法可以使它适用于后两类。
相关文章:
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 如何在模板函数中实例化其长度使用模板参数的数组
- 基于参数创建数组
- Pybind11 默认参数 numpy 数组或 None
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 更改为参数的数组的值
- 根据 C++11 中的模板参数选择数组大小
- 是否可以使用C 函数中的const int参数创建数组
- 根据参数将数组分成 5 个不同的数组
- 你究竟如何通过函数的参数传递数组?
- 函数参数中数组大小未指定
- 数组作为函数参数查找数组长度时出错
- 如何使用函数参数设置数组大小
- 可变参数模板数组调用未定义的行为
- 提升 1.55,而 13 信号参数错误数
- 指向作为模板参数的数组的指针
- C++可变参数模板数组/访问元素
- 在 c++ 中没有参数的数组
- 具有双精度参数的数组
- 使用 C++11 的 begin() 和 end() 函数通过参数确定数组维度