在右值和左值引用中创建函数时,有没有办法避免重复的代码?

时间:2019-05-12 21:49:21

标签: c++ templates

有时候,当我创建一个函数时,它需要一个右值引用版本,例如:

mouse

所以我可以打印任何template<typename T> void printCont(T &Cont){ for (auto &i : Cont) cout << i << ' '; cout << endl; } 之类的容器,但我需要管理一些直接打印的右值

std::vector

因此,我可以将其称为template<typename T> void printCont(T &&Cont){ for (auto &i : Cont) cout << i << ' '; cout << endl; } 作为示例。 (在此示例中,将复制此版本中要打印的内容复制到左值向量将很容易,但是在实际程序中,这样做会使我们的程序变慢)

但是,正如您所看到的,两个功能都具有相同的代码。我知道吗,重复代码是良好做法的错误。所以我的问题是关于...是否可以从右值版本或viseversa调用函数的左值版本?有办法避免这种重复的代码吗?想象一下,我创建了两个2000lines函数,并且我需要同时创建两个版本,只做“ Control + C”和“ Control + V”就会浪费很多行。

1 个答案:

答案 0 :(得分:6)

对于第二个功能:

template<typename T> void printCont(T &&Cont)

它实际上是一个forwarding reference,这意味着可以同时使用lvalue和rvalue参数来调用它。如果使用左值调用,则T会得出左值引用类型。您可以从代码中删除第一个版本。


由于您的代码不会修改操作数,因此另一个选择是使用:

template<typename T> void printCont(T const& Cont)

也将同时接受左值和右值。


  

(在此示例中,很容易将要在该版本中打印的内容复制到左值向量,但是在现实程序中,这样做会使我们的程序变慢)

这没有任何意义,似乎您对左值和右值有一些误解。