代码之家  ›  专栏  ›  技术社区  ›  Candy Chiu

如何包装多级原始指针以赋予其容器语义

c++
  •  1
  • Candy Chiu  · 技术社区  · 6 年前

    我如何包装 T** 给它 std::vector<std::vector<T>> 语义?到目前为止,我找到的所有解决方案都只针对一个维度。

    用例是通过这两个 T型** 标准::向量(<标准::向量(<T>&燃气轮机; 到使用矩阵数据的函数。

    template<class RowIt>
    void foo(RowIt rowFirst, RowIt rowLast) {
        // size doesn't handle dynamically allocated arrays        
        size_t columns = std::size(*rowFirst);     
    
        // second layer std::begin, std::end and iterator doesn't 
        // work for dynamically allocated arrays
        for (; rowFirst != rowLast; ++rowFirst) {
           auto colFirst = std::begin(rowFirst);
           auto colLast = std::end(rowFirst);
           for (; colFirst != colLast; ++colFirst) {
               // processing logic
           }
        }
    }
    

    我试图将一维解决方案扩展到多维。我遇到的问题是

    template<class T>
    class view {
       T* data_;
    };
    

    view<view<T>> 无法由组成 view<T>

    1 回复  |  直到 6 年前
        1
  •  1
  •   Caleth    6 年前

    您可以为嵌套 views

    template<class T>
    class view {
       using pointer = T*;
       pointer data_;
    };
    
    template<class T>
    class view<view<T>> {
       using pointer = typename view<T>::pointer *;
       pointer data_;
    };
    

    或指定 view::pointer 通过traits类,如果它是与主模板唯一不同的

    template<class T>
    class view_traits {
       using pointer = T*;
    };
    
    template<class T>
    class view_traits<view<T>> {
       using pointer = typename view<T>::pointer *;
    };
    
    template<class T>
    class view {
       using pointer = typename view_traits<T>::pointer;
       pointer data_;
       // other members use T unchanged
    };