Информация об изменениях

Сообщение Re: Variadic templates arguments position от 10.04.2020 9:44

Изменено 10.04.2020 9:46 _NN_

Re: Variadic templates arguments position
Здравствуйте, koenjihyakkei, Вы писали:

K>Можно ли как то такое починить или это в принципе не должно работать?

Можно вытащить последний аргумент например так:

template<typename T>
struct identity
{
    using type = T;
};

template<typename... Ts>
struct select_last
{
    using type = typename decltype((identity<Ts>{}, ...))::type;
};

template<typename ...Args>
decltype(auto) get_last(Args&&... args)
{
    return (std::get< sizeof...(Args) - 1 >(std::tie(std::forward<Args>(args)...)));
}




template<typename T>
struct B : public T
{
    template<typename... Args>
    B(Args&&... args, int i) : T(std::forward<Args>(args)...), _v(get_last(std::forward(args))) {}
}


А вот как взять из args все кроме последнего не уверен, что возможно.

Если 'A' принимал бы в конструкторе tuple тогда можно было бы создать кортеж и убрать последний элемент.
Re: Variadic templates arguments position
Здравствуйте, koenjihyakkei, Вы писали:

K>Можно ли как то такое починить или это в принципе не должно работать?

Можно вытащить последний аргумент например так:

template<typename T>
struct identity
{
    using type = T;
};

template<typename... Ts>
struct select_last
{
    using type = typename decltype((identity<Ts>{}, ...))::type;
};

template<typename ...Args>
decltype(auto) get_last(Args&&... args)
{
    return (std::get< sizeof...(Args) - 1 >(std::tie(std::forward<Args>(args)...)));
}




template<typename T>
struct B : public T
{
    template<typename... Args>
    B(Args&&... args, int i) : T(std::forward<Args>(args)...), _v(get_last(std::forward(args))) {}
}


А вот как взять из args все кроме последнего не уверен, что возможно.
Обновление: Хотя наверное и возможно. Упаковать args в std::tuple, убрать последний элемент и распаковать обратно.

Если 'A' принимал бы в конструкторе tuple тогда можно было бы создать кортеж и убрать последний элемент.