gpt4 book ai didi

c++ - 在 C++ 中传递回调函数参数的最佳方法

转载 作者:IT老高 更新时间:2023-10-28 22:38:03 26 4
gpt4 key购买 nike

在 C++ 中传递 回调函数 参数的最佳方式是什么?

我想简单地使用模板,像这样:

template <typename Function>
void DoSomething(Function callback)

这是使用的方式,例如在 std::sort用于比较函数对象。

使用 && 传递怎么样?例如:

template <typename Function>
void DoSomething(Function&& callback)

这两种方法的优缺点是什么,为什么 STL 使用前者,例如在 std::sort?

最佳答案

template <typename Function>
void DoSomething(Function&& callback)

… 它使用 forwarding reference通过引用传递,恕我直言,在函数只使用回调的情况下是优越的。因为仿函数对象虽然通常很小,但可以任意大。按值传递它会产生一些不必要的开销。

形式参数可以结束为 T& , T const&T&&视实际情况而定。


另一方面,通过引用传递一个简单的函数指针涉及一个额外的不必要的间接,原则上这可能意味着一些轻微的开销。

如果不确定这对给定的编译器、系统和应用程序是否重要,则测量


关于

why does the STL uses the former [passing by value] e.g. in std::sort?

…值得注意的是std::sort自 C++98 以来就已经存在,远在 C++11 中引入转发引用之前,因此它最初不能具有该签名。

可能只是没有足够的动力来改进这一点。毕竟,一个人通常不应该修复有效的东西。尽管如此,“execution policy” argument 的额外重载在 C++17 中引入。

由于这涉及可能的 C++11 更改,因此通常的基本原理来源并未涵盖它,即 Bjarne Stroustrup 的 “The design and evolution of C++”. ,而且我不知道任何确凿的答案。


使用 template<class F> void call( F )样式,您仍然可以返回“按引用传递”。只需做call( std::ref( your callback ) ) . std::ref覆盖 operator()并将其转发给包含的对象。

同样,template<class F> void call( F&& )风格,你可以写:

template<class T>
std::decay_t<T> copy( T&& t ) { return std::forward<T>(t); }

显式复制某些内容并强制 call使用 f 的本地拷贝作者:

call( copy(f) );

所以这两种样式的主要区别在于默认情况下的行为方式。


关于c++ - 在 C++ 中传递回调函数参数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40588734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com