[英]What is the difference between different ways of passing a function as an argument to another function?
我有一个 function 调用几个可能函数之一的情况。 这似乎是传递 function 作为参数的好地方。 在 Zubkov 的Quoara 回答中,有三种方法可以做到这一点。
int g(int x(int)) { return x(1); }
int g(int (*x)(int)) { return x(1); }
int g(int (&x)(int)) { return x(1); }
...
int f(int n) { return n*2; }
g(f); // all three g's above work the same
什么时候应该使用哪种方法? 有什么区别? 我更喜欢最简单的方法,那么为什么不应该总是使用第一种方法呢?
对于我的情况,function 只调用一次,我想保持简单。 我让它通过指针传递,我只是用g(myFunc)
调用它,其中myFunc
是最后调用的 function。
扩展 LF 的评论,通常最好完全避开 function 指针,并根据可调用对象(定义operator()
的东西)工作。 以下所有内容都允许您这样做:
#include <type_traits>
// (1) unrestricted template parameter, like <algorithm> uses
template<typename Func>
int g(Func x) { return x(1); }
// (2) restricted template parameter to produce possibly better errors
template<
typename Func,
typename=std::enable_if_t<std::is_invocable_r_v<int, Func, int>>
>
int g(Func x) { return std::invoke(x, 1); }
// (3) template-less, trading a reduction in code size for runtime overhead and heap use
int g(std::function<int(int)> x) { return x(1); }
重要的是,与您的任何选项不同,所有这些都可以用于带有捕获的 lambda 函数:
int y = 2;
int ret = g([y](int v) {
return y + v;
});
正如您在链接到的 Quora 问题中所指出的,前两个选项使用 function 指针,最后一个选项使用 function 引用。
有关通过指针或引用传递参数是否更好的一般性讨论,请参阅此 Stack Overflow 问题。
通常,引用更容易、更安全,但指针更强大,因为指针可以重新分配,您也可以进行指针运算。 这也适用于函数的指针和引用。
既然您表示要保持简单,我建议您使用引用,即第三行的选项。 这样,编译器将阻止您对引用做潜在危险的事情。 我认为在您的情况下使用指针没有任何好处,因为您没有理由重新分配指针或进行指针运算。
但是,使用指针还是引用也是个人喜好问题。 由于我更像是 C 程序员而不是 C++ 程序员,因此我个人更喜欢指向引用的指针。
无论您使用引用还是指针,编译器都会生成相同的机器代码(使用指针)。 引用只是只存在于源代码中的指针的抽象。 当编译器创建可执行文件时,它们稍后将转换为指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.