Можно ли инициализировать член класса (или вызвать конструктор суперкласса), используя аргументы, содержащиеся в кортеже?
Обратите внимание, что я в курсе 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)...
) {
}
};
Если вы настаиваете на том, чтобы не использовать 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)...)
{ }
Других решений пока нет …