Есть ли способ избежать дублирования кода при создании функции в ссылках rvalue и lvalue? - PullRequest
3 голосов
/ 13 мая 2019

Иногда, когда я создаю функцию, ей нужна справочная версия rvalue, например:

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()) в качестве примера. (в этом примере было бы просто скопировать содержимое для печати в этой версии в вектор lvalue, но в реальных программах это сделало бы нашу программу более медленной)

Но, как вы можете видеть, ОБА ФУНКЦИИ ИМЕЮТ ТО ЖЕ КОД. Знаю ли я, дублированный код является ошибкой в ​​хороших практиках. Так что мой вопрос о ... есть ли способ вызвать версию функции lvalue из версии rvalue или viseversa? Есть ли способ избежать этого дублированного кода? Представьте, что я создаю две функции 2000 линий, и мне нужно создать обе версии, это будет пустой тратой строк, просто сделайте «Control + C» и «Control + V».

1 Ответ

6 голосов
/ 13 мая 2019

Для второй функции:

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

это на самом деле ссылка для пересылки , что означает, что ее можно вызывать как с аргументами lvalue, так и с rvalue. Если вызывается с lvalue, то T выводит lvalue ссылочный тип. Вы можете удалить первую версию из своего кода.


Другой вариант, поскольку ваш код не изменяет операнд, это использовать:

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

, который также будет принимать как lvalue, так и rvalues.


(в этом примере было бы просто скопировать содержимое для печати в этой версии в вектор lvalue, но в реальных программах это сделало бы нашу программу более медленной)

Это не имеет смысла, кажется, у вас есть какое-то недопонимание относительно lvalues ​​и rvalues.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...