说我有以下类型的别名:
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);
这两种方法都有其优点,允许不同用途。
return方法的一个优点是可以创建内联窗口并删除显式临时窗口:
auto mywindow = attach_context(make_window(), make_context());
无需为w
或c
创建额外的变量,rvalues也没问题。
但是,当我们已经有window_handle
时,lvalue-reference参数方法还具有不必创建新变量或进行额外分配的优势:
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
可能失败。
从性能和可用性的角度来看,我应该选择哪种方法?哪个似乎最惯用?
答案 0 :(得分:0)
我的方法是对窗口使用const-reference并按值传递上下文。这样的事情是明确的:
void attach_context(window_handle const& wh, context_handle ch);
必须传递对上下文的所有权,并且attach_context没有选择获取窗口的所有权并将其他内容传回去。
澄清后更新:
鉴于attach_context()
解除分配并创建新的window
实例,对window_handle
的const引用将不起作用。所以双rvalue-reference接口可能更可取:
void attach_context(window_handle&& wh, context_handle&& ch);
为什么rvalue-references超过引用?避免接口中的非const引用。这源于Lakos&#34;大规模C ++软件开发&#34;因此,您可以在调用站点看到是否修改参数。如果你取一个地址(即非常量指针),你知道该参数将被修改,否则该参数将被该函数保持不变。这个建议是陈旧的(~1997),并且早于rvalue参考。
rvalue参考的存在提供了明显的优势。使用std::move
或在呼叫方面传递右值引用可以清楚地说明正在发生的事情,达到相同的目标。