Одна возможная реализация:
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);
}