Распакуйте кортеж в инициализацию члена или конструктор суперкласса

Можно ли инициализировать член класса (или вызвать конструктор суперкласса), используя аргументы, содержащиеся в кортеже?
Обратите внимание, что я в курсе std::make_from_tuple() а также std::apply() но они не могут быть использованы в этом сценарии.

Рассматривать sometype является не копируемыми, не конструктор по умолчанию, не подвижный, не присваивается, не что-нибудь еще. Единственный способ его создания — использование аргументов, которые предоставляются как std::tuple,
Можно ли это сделать?

Моя попытка не удалась, так как «шаблон расширения не содержит пакет аргументов», хотя генерирование index_sequence должно быть одним.

class node {
public:
sometype value;
template <typename... Args>
explicit node(const std::tuple<Args...>& args_tuple) :
value(
std::get<
std::index_sequence_for<Args...>{}
>(args_tuple)...
) {
}
};

-1

Решение

Если вы настаиваете на том, чтобы не использовать std::make_from_tuple()Вам нужен другой уровень косвенности:

public:
explicit node(const std::tuple<Args...>& args_tuple) :
node(args_tuple, std::make_index_sequence<sizeof...(Args)>{})
{ }

private:
template<class Tuple, std::size_t... is>
node(const Tuple& args_tuple, std::index_sequence<is...>) :
value(std::get<is>(args_tuple)...)
{ }
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector