网上有很多使用 STL 将函数或函数对象作为参数传递的示例,例如在 std::count 中。
我如何编写自己的函数来接受这些参数?
举个简单的例子,假设我的课程是:
struct Foo{
int val=0;
int methodinc()const{return val+1};
}
我想定义一个函数funccall,如:
int funcall (foo arg, function f)
{return f(arg); }
其中声明“功能”是我不确定的,除其他外。术语“funcall”来自 Lisp,(funcall f a b c)
仅适用f
于参数 ab c。
然后这样的事情应该工作:
Foo ff;
funcall(ff,Foo::methodinc); // should return 1
funcall(ff, [](Foo x) {return x.val+1;}) // should return 1
有什么简单的方法可以做到这一点?
我正在编写这些作为调试助手,“funcall”将用作我自己的实现的一部分,就像我自己的数据结构的 count、remove-if、transform 和其他类似 STL 函数一样,它们接受函数参数。但我不想编写复杂的模板表达式来定义我的代码。
这个问题的初步答案表明,声明和使用函数参数的整个概念有点模糊,至少对我来说是这样。也许在处理 funcall 之前,更简单的任务可能是将函数参数传递给另一个函数,而不是使用它。例如,在 C++ 中,要计算一个向量 v 我必须写
std::count(v.begin, v.end(), [](int j){return j>3})
如何编写一个始终计算整个向量的计数,以便:
mycount(v,[](int j){return j>3})
和上面一样吗?这个“mycount”可以用于成员函数指针而不是 lambdas 吗?
这个问题与“funcall”问题基本相同,但不需要实际调用传递的函数对象。