提供功能版本,其中可用值和参考

Providing functions versions where both by value and by reference are available

本文关键字:参考 功能 版本      更新时间:2023-10-16

我定义了此功能:

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

现在,假设有时我想用T=intT=std::string称呼它。因此,在第二种情况下,标题是有效的,但是使用T=int,这是效率低下的。请注意,我仅以这两种类型为例。

因此,更好的解决方案将通过以下方式定义另一个功能:

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

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

但是使用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;
}

这是一个很好的解决方案,很可能会被编译器隔离和优化...但是,如果您要做的只是避免通过参考传递原始类型,那有什么意义呢?我们在此处为 function对象。。。


因此,我强烈建议您只有一个foo的单个版本。按值返回的一个更惯用的C 11,并且不会比RVO和移动语义引起的参考的一个较慢。