c++ - 提供按值和按引用都可用的函数版本

标签 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 调用它。因此,在第二种情况下, header 是有效的,但是 T=int this is inefficient .请注意,我仅使用这两种类型作为示例。

所以更好的解决方案是定义另一个函数:

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

让用户决定调用哪个版本,但是我们如何避免在函数中调用//一些非常复杂的东西的整个代码?

最佳答案

but with T=int this is inefficient

启用编译器优化后,这很可能不再重要 - 重要的情况可以通过分析检测到并单独处理。


but how do we avoid to call the whole code of //some very complicate stuff in the function?

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

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 和移动语义 而不会比采用引用的方法慢。

关于c++ - 提供按值和按引用都可用的函数版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42764943/

相关文章:

c++ - 对 C++ 类继承有点生疏

java - Java 是否允许在不将返回数据捕获到本地列表的情况下对列表进行排序之类的操作?

c++ - C++ 中的 3 维 vector -传递给函数之前的部分大小定义

c++ - 编译器不会使用 -std=c++11 编译智能指针

c++ - 为什么当我有两个函数时编译器不显示错误,一个函数将基类作为参数,一个函数将派生类作为参数?

c++ - 在 C++ 中按大小为零分配内存?

java - 从用java编码的客户端返回值?

javascript - 如何从 Javascript 的父函数返回在子 jQuery 函数中创建的数组?

C 函数数组

PHP在递归函数中通过引用传递不起作用