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

亚历山大·费多罗斯v789

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

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”就会浪费很多行。

MM

对于第二个功能:

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

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


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

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

它也将接受左值和右值。


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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法让成员函数知道对象是右值还是左值?

有没有办法将左值和右值列表分别转换为具有引用类型和完整类型的元组元组?

有没有办法在C ++中通过引用传递右值?

提供左值和右值重载时,是否有办法删除重复的代码?

有没有办法在代码中重用具有不同值的函数?

SQL 中的 STUFF(...) 函数有没有办法防止重复值?

有没有办法避免d3.js中的代码重复?

有没有办法在 VBA 中编写代码,可以自动在列中为重复值编写文本?

有没有办法让这段代码计算数组中重复值的数量,为字符串工作?

有没有办法创建枚举值的别名?

在定义新变量时,有没有办法在 SAS/SQL 中引用先前观察值?

有没有办法检查 MongoDB 中数组值中的重复条目?

有没有办法在 SQL 的多行中显示一次重复的列值?

有没有办法在 postgres 中创建具有值的 CTE?

有没有办法在 Django 中创建记录时自动创建页面(和 slug)

有没有办法可以在“tableView”函数中使用“func startObservingDB()”中的“数据”、“值”和“rowNumber”常量?

有没有办法以角度调用html属性值中的函数?

有没有办法在使用列表时不更改列表中的原始值?

有没有办法在 Pandas Dataframe 的多行和多列中对值进行排名?

有没有办法在python中同时设置和评估值?

有没有办法从熊猫中的现有列值中创建一个值列表?

在创建 Azure 容器实例时,有没有办法设置没有值的环境变量?

有没有办法以简单的方式重复代码?

有没有办法在使用类成员函数时始终按值传递(制作副本)而不是按引用传递?

有没有办法避免可观察对象中的循环引用?

使用函数作为回调时,有没有办法避免存储开销?

collections.Counter,有没有办法避免添加字符串值?

有没有办法避免以下代码中的内存泄漏?

有没有办法将多个值作为C中单个定义的宏值传递给宏函数?