C ++ 17 Tuple Распаковка - PullRequest
2 голосов
/ 13 марта 2019

Я пытаюсь распаковать кортеж и использовать результаты для распределения по элементам.Возможно ли это сделать в идиоматическом C ++ 17?

Я понимаю, что std::tie существует, но я пытаюсь использовать функции C ++ 17 и не по умолчанию использовать старые функции или старый способ (std::get<N>(tuple))

tuple<A, vector<A>> IO(){
     //IO happens here
     return {var, vec};
}

class foo{
public:
    foo();
private:
    A var;
    vector<A> vec;
};

foo::foo(){
    //this line here: I want to assign var and vec from IO()
    [var, vec] = IO();
}

1 Ответ

5 голосов
/ 13 марта 2019

Не совсем. Структурированные привязки могут только объявлять новые имена, но не могут присваивать существующим.

Лучше всего просто сделать это:

foo() : foo(IO()) { } // delegate to a constructor, calling IO

foo(std::tuple<A, vector<A>>&& tup) // manually unpack within this constructor
  : var(std::get<0>(std::move(tup)))
  , vec(std::get<1>(std::move(tup)))
{ }
<ч />

Если A оказывается конструируемым по умолчанию и назначаемым для перемещения, то да, это тоже работает:

foo() {
    std::tie(var, vec) = IO();
}

Если A случится с , а не , может быть конструируемым по умолчанию, тогда вы можете использовать optional, чтобы добавить это дополнительное состояние:

struct foo {
    std::optional<A> var;
    std::vector<A> vec;

    foo() {
        std::tie(var, vec) = IO();
    }
};

Ни один из них не особенно хорош.

...