C ++ получение значений из кортежа - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть класс Storage, где у меня есть кортеж векторов. Я хочу быть в состоянии получить значения от этого. Как мне реализовать getRow ()?

Все векторы всегда имеют одинаковую длину.

template<class ... Ts>
class Storage
{
    std::tuple<std::vector<Ts>...> m_col;

public:
    auto getRow(int row) {
        // get row-th element from each vector, put it together and return them as tuple
    }

    template<size_t I>
    auto getElement(int row) {
        return get<I>(m_col)[row];
    }
};

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Вы также можете использовать std::apply (C ++ 17), что проще, чем index_sequence s:

auto getRow(std::size_t row)
{
    return std::apply([&](const auto&... columns) {
        return std::tuple<Ts...>{columns[row]...};
    }, m_col);
}
2 голосов
/ 22 апреля 2020

Одна возможная реализация:

public:
    std::tuple<Ts...> get_row(std::size_t row) const {        
        return get_row_impl(row, std::index_sequence_for<Ts...>{});
    }

private:
    template<std::size_t... is>
    std::tuple<Ts...> get_row_impl(std::size_t row, std::index_sequence<is...>) const {
        assert(((row < std::get<is>(m_col).size()) && ...));
        return std::tuple<Ts...>(std::get<is>(m_col)[row]...);
    }

Альтернативная реализация с std::apply и variadi c lambda:

public:
    std::tuple<Ts...> get_row(std::size_t row) {        
        return std::apply([row](const auto&... vs) {
            return std::tuple<Ts...>{vs[row]...};
        }, m_col);
    }
...