Моя шаблонная функция с универсальной ссылкой не работает - PullRequest
2 голосов
/ 22 мая 2019

Я хочу создать шаблонную функцию, которая будет гибкой и может принимать как rvalue, так и lvalue.Вот как я это написал:

template<typename T>
decltype(auto) normalize_pose(T&& pose)
{
    if (pose > 2 * M_PI) return std::forward<T>(pose - 2* M_PI);
} 

Итак, я дважды проверил функцию, и она мне кажется правильной.Тогда я решил проверить это и написал:

int a = 2;
auto test = factorgraph::normalize_pose(a);

Я получаю эту ошибку:

 error: use of ‘decltype(auto) factorgraph::normalize_pose(T&&) [with T = int&]’ before deduction of ‘auto’

Если я пытаюсь добавить <int>, я получаю ошибку, что такой функции нетесть.

1 Ответ

8 голосов
/ 22 мая 2019

Это должно быть

if (pose > 2 * M_PI) return std::forward<T>(pose) - 2* M_PI;

Применить std::forward только к переменной.

И вам также необходимо вернуть значение для ветви else (того же типа, чтобы удовлетворить decltype(auto)).

Но в вашем случае все просто:

template<typename T>
auto normalize_pose(const T& pose)
{
    return (pose > 2 * M_PI) ? pose - 2 * M_PI : pose;
}

обрабатывает все случаи.

...