Распакуйте кортеж в инициализацию члена или конструктор суперкласса - PullRequest
0 голосов
/ 16 октября 2018

Можно ли инициализировать член класса (или вызвать конструктор суперкласса), используя аргументы, содержащиеся в кортеже?Обратите внимание, что мне известны 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 Ответ

0 голосов
/ 16 октября 2018

Если вы настаиваете на том, чтобы не использовать 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)...)
    { }
...