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



如何包装T**以赋予其std::vector<std::vector<T>>语义?到目前为止,我找到的所有解决方案都涉及一个单一的维度。

用例是将T**std::vector<std::vector<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_;
};

CCD_ 5不能由CCD_ 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_;
};

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

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
};

最新更新