gpt4 book ai didi

c++ - 通过参数或返回值修改

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:32 24 4
gpt4 key购买 nike

假设我有以下类型别名:

class window;
class context;

using window_handle = std::unique_ptr<window>;
using context_handle = std::unique_ptr<context>;

和一些制作 handle 的函数:

window_handle make_window(/* window parameters */);
context_handle make_context(/* context parameters */);

那么将上下文组合到窗口中的最佳做法是什么?

(context_handle 变量在此操作后将不再使用)


可能的解决方案可能是......

修改一个引用参数:

void attach_context(window_handle &w, context_handle &&c);

或返回一个组合句柄,该句柄拥有先前句柄的所有权:

window_handle attach_context(window_handle &&w, context_handle &&c);

这两种方法各有千秋,用途各异。

return 方法的一个优点是内联窗口创建和删除显式临时对象:

auto mywindow = attach_context(make_window(), make_context());

无需为 wc 创建额外的变量,右值就可以了。

但是左值引用参数方法还有一个优点,即当我们已经有了一个window_handle时,不必创建新变量或进行额外的赋值:

auto mywindow = make_window();

if(need_attached_window)
attach_context(mywindow, make_context());

对于返回值方法,我们必须使用 std::move 转换和一个额外的变量或赋值:

auto mywindow = make_window();

if(need_attached_window)
mywindow = attach_context(std::move(mywindow), make_context());

所有这些都没有考虑到 make_xxx 可能会失败。


从性能和可用性的角度来看,我应该更喜欢哪种方法?哪个看起来最地道?

最佳答案

我的方法是对窗口使用常量引用并按值传递上下文。这样,发生的事情就很明确了:

void attach_context(window_handle const& wh, context_handle ch);

必须传递对上下文的所有权,而 attach_context 没有选择获取窗口所有权并将其他内容传回的选项。

澄清后更新:

鉴于 attach_context() 释放并创建了一个新的 window 实例,对 window_handle 的 const 引用将不起作用。所以双右值引用接口(interface)可能更可取:

void attach_context(window_handle&& wh, context_handle&& ch);

为什么右值引用优于引用?避免接口(interface)中的非常量引用。这源于 Lakos 的《大规模 C++ 软件开发》,因此您可以在调用站点看到是否修改参数。如果你取一个地址(即非常量指针),你知道参数将被修改,否则参数不会被函数更改。这个建议很旧(~1997 年)并且早于右值引用。

右值引用的存在带来了明显的优势。使用 std::move 或在调用端传递一个右值引用可以清楚地表明正在以相同的方式发生什么,达到相同的目标。

关于c++ - 通过参数或返回值修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664722/

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