是否有一种方法可以避免在RVALUE和LVALUE参考中创建功能时避免重复的代码

Is there a way to avoid duplicated code while creating a function in rvalue and lvalue references?

本文关键字:功能 创建 参考 代码 LVALUE 一种 RVALUE 可以避免 方法 是否      更新时间:2023-10-16

有时我创建一个函数时,它需要一个rvalue参考版本,例如:

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())。(在此示例中,很容易将内容复制在此版本中,将其放到lvalue vector中,但是在现实世界程序中,这样做会使我们的程序变慢(

,但是如您所见,两个函数都具有相同的代码。我知道,重复的代码在良好实践中是一个错误。所以我的问题是关于...有没有办法从rvalue版本或viseversa调用函数的lvalue版本?有没有办法避免这种重复的代码?想象一下,我创建了两个2000Lines功能,我需要创建两个版本,这将是浪费行,只是"控制 c"answers" control v"。

用于第二个功能:

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

它实际上是一个转发参考,这意味着可以使用lvalue和rvalue参数调用。如果用LVALUE调用,则T推迟到LVALUE参考类型。您可以从代码中删除第一个版本。


另一个选项,因为您的代码未修改操作数,是使用:

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

也将同时接受lvalues和rvalues。


(在此示例中

这没有任何意义,看来您对lvalues和rvalues有一些误解。