假设我有以下类型的别名:
class window;
class context;
using window_handle = std::unique_ptr<window>;
using context_handle = std::unique_ptr<context>;以及制作手柄的一些功能:
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);这两种方法都有优点,并允许不同的用途。
返回方法的一个优点可以是内联窗口的创建和删除显式临时窗口:
auto mywindow = attach_context(make_window(), make_context());不需要为w或c创建额外的变量,rvalue也可以。
但是,当我们已经有了一个window_handle时,lvalue引用参数方法也有一个优点,即不必创建一个新变量或执行额外的赋值。
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可能会失败。
从性能和可用性的角度来看,我应该更喜欢哪种方法?哪个看起来最惯用?
发布于 2015-07-27 23:03:32
我的方法是对窗口使用const引用,并通过值传递上下文。通过这种方式,所发生的事情是明确的:
void attach_context(window_handle const& wh, context_handle ch);必须传递对上下文的所有权,attach_context不能选择获取窗口的所有权并将其他东西传回。
澄清后的最新情况:
假设attach_context()释放并创建了一个新的window实例,那么对window_handle的const引用将无法工作。因此,双rvalue-引用接口可能更好:
void attach_context(window_handle&& wh, context_handle&& ch);为什么rvalue-引用多于引用?避免接口中的非const引用。这源于Lakos的“大规模C++软件开发”,因此您可以在调用站点上查看参数是否将被修改。如果你有地址的话.)您知道参数将被修改,否则参数将被函数更改。这个建议是旧的(~1997)并且早于rvalue引用。
rvalue引用的存在具有明显的优势。使用std::move或在调用端传递一个rvalue引用可以清楚地了解以相同方式正在发生的事情,以实现相同的目标。
https://stackoverflow.com/questions/31664722
复制相似问题