有时,当我创建一个函数时,它需要一个右值引用版本,例如:
template<typename T> void printCont(T &Cont){
for (auto &i : Cont)
cout << i << ' ';
cout << endl;
}
所以我可以打印任何容器,std::vector
但是我需要管理一些rvalue才能直接打印
template<typename T> void printCont(T &&Cont){
for (auto &i : Cont)
cout << i << ' ';
cout << endl;
}
所以我可以printCont(myclass.getVector())
举个例子。(在此示例中,将复制此版本中要打印的内容复制到左值向量将很容易,但是在实际程序中,这样做会使我们的程序变慢)
但是正如您所看到的,两个功能都有相同的代码。我知道吗,重复代码是良好做法的错误。所以我的问题是...有没有办法从右值版本或viseversa调用函数的左值版本?有办法避免这种重复的代码吗?想象一下,我创建了两个2000lines函数,并且我需要创建它的两个版本,只做“ Control + C”和“ Control + V”就会浪费很多行。
对于第二个功能:
template<typename T> void printCont(T &&Cont)
它实际上是一个转发引用,这意味着可以同时使用lvalue和rvalue参数来调用它。如果使用左值调用,则T
推导为左值引用类型。您可以从代码中删除第一个版本。
由于您的代码不会修改操作数,因此,另一个选择是使用:
template<typename T> void printCont(T const& Cont)
它也将接受左值和右值。
(在此示例中,将复制此版本中要打印的内容复制到左值向量将很容易,但是在实际程序中,这样做会使我们的程序变慢)
这没有任何意义,似乎您对左值和右值有一些误解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句