C ++ сохраняет ценность и ценность с помощью локальной переменной - PullRequest
1 голос
/ 13 июля 2020

У меня есть функция, которая принимает либо lvalue, либо rvalue:

void doSomething(Foo& foo);
void doSomething(Foo&& foo);

И другие функции, которые возвращают либо rvalue, либо lvalue:

Foo fun1();
Foo& fun2();
// ...

Теперь я хочу передать результат этих функций на doSomething. Конечно, я могу сделать следующее:

template<typename F>
void callFunctions(F&& funToCall) {
   doSomething(funToCall());
}

Но как я могу сохранить результат funToCall и передать doSomething правильное lvalue или rvalue. Я хочу сделать что-то вроде:

template<typename F>
void callFunctions(F&& funToCall) {
   auto theResult = funToCall();
   doSomething(theResult); // I want to call the correct overload and not always the Foo& one
}

1 Ответ

2 голосов
/ 13 июля 2020

Вы можете сделать следующее:

template<typename F>
void callFunctions(F&& funToCall) {
   auto &&theResult = funToCall();
   doSomething(std::forward<decltype(theResult)>(theResult));
}

, чтобы theResult правильно выводил Foo& или Foo&& в зависимости от ситуации, а затем std::forward этого типа для вызова правильной перегрузки.

Вот демонстрация

...