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

标签 c++ templates

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

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;
}

所以我可以将其称为 printCont(myclass.getVector()) 作为示例。 (在这个例子中,将要打印的内容复制到一个左值 vector 很容易,但在现实世界的程序中,这样做会使我们的程序变慢)

但是如您所见,这两个函数具有相同的代码。我知道吗,重复的代码是良好做法中的错误。所以我的问题是……有没有办法从右值版本或 viseversa 调用函数的左值版本?有没有办法避免这种重复的代码?想象一下,我创建了两个 2000 行函数,并且我需要创建它的两个版本,只执行“Control+C”和“Control+V”会浪费行数。

最佳答案

对于第二个函数:

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

它实际上是一个forwarding reference ,这意味着可以使用左值和右值参数调用它。如果使用左值调用,则 T 会推导为左值引用类型。您可以从代码中删除第一个版本。


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

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

它也将接受左值和右值。


(in this example would be to easy to just copy the content to print in this version, to a lvalue vector, but in real world programs, do this would make our program slower)

这说不通,看来你对左值和右值有一些误解。

关于c++ - 有没有办法在右值和左值引用中创建函数时避免重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56103746/

相关文章:

c++ - 如何在 C++ 中传递一个 std-functor 并在不知道它具体是哪个的情况下使用它

c++ - C++ 是否会自动转换某些操作重载?

c++ - Recvfrom() 挂起——当服务器关闭时如何处理这个问题

c++ - 模板外部链接?谁能解释一下?

c++ - 什么是参数值的尖括号,它的用途是什么?

c++ - 'help' 编译器如何从作为函数的模板参数推导出函数模板返回类型?

c++ - 我怎样才能允许将 vector 传递给 INFO()、CAPTURE()、WARN() 等,同时避免非法扩展 std namespace ?

c++ - 从没有sstream c++的字符串中提取整数

具有友元函数和运算符重载的 C++ 模板

javascript - JQuery 模板 : How to preserve backslashes in content?