Распаковывание переменных шаблона

Всем привет! Уже немало времени пытаюсь понять, как получить доступ к списку переменных шаблонов. Необходимо для каждого передаваемого параметра, если он является rvalue, сделать кое-какие преобразования и результат поместить в вектор. Но этот код вызывает не

vec.push_back(T&&)

, а его lvalue аналог

vec.push_back(const T&)

Вот код самой функции:

template <typename T>
template <typename... Args>
void Func(std::vector<T>& vec, Args&&... args) {
    for(auto&& x : { std::forward<Args>(args)...} ) {
        /* какие-то манипуляции с x */
        vec.push_back(std::move(x));
    }
}

Подскажите, как вызывать метод с rvalue?


Ответы (1 шт):

Автор решения: HolyBlackCat

С std::initializer_list проблема в том, что в нем элементы всегда константные. Перемещать из него не получится.

Я бы сделал что-то вроде:

template <typename T, typename ...P>
void Func(std::vector<T> &vec, P &&... params)
{
    auto lambda = [&](auto &&x)
    {
        /* какие-то манипуляции с x */
        vec.push_back(decltype(x)(x));
    };

    (lambda(std::forward<P>(params)), ...);
}
→ Ссылка