如何包装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
};