【问题标题】:How to create a tuple of vectors of type deduced from a variadic template in C++17?如何创建从 C++17 中的可变参数模板推导出的类型向量元组?
【发布时间】:2019-04-17 17:25:22
【问题描述】:

我已经实现了一个集合类,它将元组向量转换为向量元组(它本质上是 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();
}

【问题讨论】:

    标签: c++ c++17 variadic-templates stdtuple structure-of-arrays


    【解决方案1】:

    您使用的是 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);
           }
     };
    

    【讨论】:

      【解决方案2】:

      你可以用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);
          } 
      
      };
      

      Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多