首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按参数或返回值修改

按参数或返回值修改
EN

Stack Overflow用户
提问于 2015-07-27 22:59:37
回答 1查看 92关注 0票数 1

假设我有以下类型的别名:

代码语言:javascript
复制
class window;
class context;

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

以及制作手柄的一些功能:

代码语言:javascript
复制
window_handle make_window(/* window parameters */);
context_handle make_context(/* context parameters */);

那么,将上下文组合到窗口中的最佳实践是什么?

(在此操作之后,context_handle变量将被使用)

可能的解决办法是..。

修改引用参数:

代码语言:javascript
复制
void attach_context(window_handle &w, context_handle &&c);

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

代码语言:javascript
复制
window_handle attach_context(window_handle &&w, context_handle &&c);

这两种方法都有优点,并允许不同的用途。

返回方法的一个优点可以是内联窗口的创建和删除显式临时窗口:

代码语言:javascript
复制
auto mywindow = attach_context(make_window(), make_context());

不需要为wc创建额外的变量,rvalue也可以。

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

代码语言:javascript
复制
auto mywindow = make_window();

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

对于返回值方法,我们必须使用std::move强制转换和附加变量或赋值:

代码语言:javascript
复制
auto mywindow = make_window();

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2015-07-27 23:03:32

我的方法是对窗口使用const引用,并通过值传递上下文。通过这种方式,所发生的事情是明确的:

代码语言:javascript
复制
void attach_context(window_handle const& wh, context_handle ch);

必须传递对上下文的所有权,attach_context不能选择获取窗口的所有权并将其他东西传回。

澄清后的最新情况:

假设attach_context()释放并创建了一个新的window实例,那么对window_handle的const引用将无法工作。因此,双rvalue-引用接口可能更好:

代码语言:javascript
复制
void attach_context(window_handle&& wh, context_handle&& ch);

为什么rvalue-引用多于引用?避免接口中的非const引用。这源于Lakos的“大规模C++软件开发”,因此您可以在调用站点上查看参数是否将被修改。如果你有地址的话.)您知道参数将被修改,否则参数将被函数更改。这个建议是旧的(~1997)并且早于rvalue引用。

rvalue引用的存在具有明显的优势。使用std::move或在调用端传递一个rvalue引用可以清楚地了解以相同方式正在发生的事情,以实现相同的目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31664722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档