繁体   English   中英

将 function 作为参数传递给另一个 function 的不同方式之间有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM