提供按值和按引用提供的功能版本

时间:2017-03-13 13:33:16

标签: c++ return pass-by-reference pass-by-value

我定义了这个功能:

template <typename T>
void foo (T &result){
  //some very complicate stuff
  result = //something
}

现在,我们假设有时我想用T=int和其他情况T=std::string来调用它。因此,在第二种情况下,标头是有效的,但使用T=int this is inefficient。请注意,我仅使用这两种类型作为示例。

因此,更好的解决方案是使用以下方法定义另一个函数:

template <typename T>
T foo(){
  T result;
  //some very complicate stuff
  return result;
}

让用户决定调用哪个版本,但是我们如何避免在函数中调用//some very complicate stuff的整个代码?

1 个答案:

答案 0 :(得分:3)

  

但使用T=int这是效率低下的

启用编译器优化很可能永远无关紧要 - 可以通过分析检测并单独处理重要的情况。

  

但是我们如何避免在函数中调用//some very complicate stuff的整个代码?

嗯,避免它的一种可能方法是要求你传递函数对象作为额外的参数:

template <typename T, typename F>
void foo (T &result, F&& complicated_stuff){
  std::forward<F>(complicated_stuff)();
  result = //something
}

template <typename T, typename F>
T foo(F&& complicated_stuff){
  T result;
  std::forward<F>(complicated_stuff)();
  return result;
}

这是一个很好的解决方案,极有可能被编译器内联和优化......但是,如果你所做的一切都是避免通过引用传递一个原始类型,那又有什么意义呢? ?我们在此处为功能对象添加了额外的转发参考

因此,我强烈建议您只使用foo的单个版本。按值返回的那个是更惯用的C ++ 11,并且由于RVO和移动语义而不会比引用参考的那个慢。