Как создать кортеж векторов типа, выведенного из шаблона с переменными числами в C ++ 17? - PullRequest
0 голосов
/ 14 ноября 2018

Я реализовал класс коллекции, который преобразует вектор кортежей в кортеж векторов (по сути, это преобразование AOS в SOA).Этот код работает для этого примера двух шаблонных классов.Я пытался сделать его более универсальным, используя вариадические шаблоны.Для этого мне нужно создать тип для переменной-члена m_col.В C ++ 17 возможно ли преобразовать кортеж в кортеж векторов?Таким образом, тип дисперсии члена m_col в этом примере будет сгенерирован автоматически из типов шаблонов.

template<class T1, class T2>
class Collection
{
    std::tuple<std::vector<T1>, std::vector<T2>> m_col;

public:
    void addRow(const std::tuple<T1, T2>& data)
    {
        std::get<0>(m_col).push_back(std::get<0>(data));
        std::get<1>(m_col).push_back(std::get<1>(data));
    } 

    void show()
    {
        std::cout << std::get<0>(m_col1).size() <<std::endl;
    }
};


int main()
{
    using data_t = std::tuple<int, double>;
    data_t data{1,1.0};
    using col_t = Collection<int, double>;
    col_t col;
    col.addRow(data);    
    col.show();
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы используете C ++ 17, так что ... как насчет свертывания шаблонов и некоторых std::apply()?

Я имею в виду

template <typename ... Ts>
class Collection
 {
   private:
      std::tuple<std::vector<Ts>...> m_col;

   public:
      void addRow (std::tuple<Ts...> const & data)
       {
          std::apply([&](auto & ... vectors){
                     std::apply([&](auto & ... values){
                                (vectors.push_back(values), ...);},
                                data); },
                     m_col);        
       } 

      void show () const
       {
         std::apply([](auto & ... vectors){
             ((std::cout << vectors.size() << '\n'), ...);}, m_col);
       }
 };
0 голосов
/ 14 ноября 2018

Вы можете сделать с std::index_sequence:

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

private:

    template <std::size_t ... Is>
    void addRow(std::index_sequence<Is...>, const std::tuple<Ts...>& data)
    {
        (std::get<Is>(m_col).push_back(std::get<Is>(data)), ...);
    } 

public:
    void addRow(const std::tuple<Ts...>& data)
    {
        addRow(std::index_sequence_for<Ts...>(), data);
    } 

};

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...