Сообщение Re: Variadic templates arguments position от 10.04.2020 9:44
Изменено 10.04.2020 9:46 _NN_
Re: Variadic templates arguments position
Здравствуйте, koenjihyakkei, Вы писали:
K>Можно ли как то такое починить или это в принципе не должно работать?
Можно вытащить последний аргумент например так:
А вот как взять из args все кроме последнего не уверен, что возможно.
Если 'A' принимал бы в конструкторе tuple тогда можно было бы создать кортеж и убрать последний элемент.
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>Можно ли как то такое починить или это в принципе не должно работать?
Можно вытащить последний аргумент например так:
А вот как взять из args все кроме последнего не уверен, что возможно.
Обновление: Хотя наверное и возможно. Упаковать args в std::tuple, убрать последний элемент и распаковать обратно.
Если 'A' принимал бы в конструкторе tuple тогда можно было бы создать кортеж и убрать последний элемент.
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 тогда можно было бы создать кортеж и убрать последний элемент.