5

我目前有以下函数来读取原始数据的数组或向量(_readStream是 a std::ifstream):

template<typename IteratorType> 
inline bool MyClass::readRawData(
    const IteratorType& first, 
    const IteratorType& last, 
    typename std::iterator_traits<IteratorType>::iterator_category* = nullptr
    )
{
    _readStream.read(reinterpret_cast<char*>(&*first), (last-first)*sizeof(*first));
    return _readStream.good();
}

第一个问题:这个功能对你来说还可以吗?

当我们直接读取一块内存时,它只有在内存块 from firsttolast在内存中是连续的情况下才会起作用。如何检查?

4

3 回答 3

4

撇开您的示例函数不谈,如果不检查两者之间每个元素的地址,您永远无法完全确定迭代器将形成一个连续的内存。

但是,一个合理的健全性测试将只是检查两者之间的内存区域是否与两者之间的计数相同:

assert(&*last - &*first == last - first &&
    "Iterators must represent a contiguous memory region");
于 2012-09-30T03:50:49.247 回答
3

n4183是一篇论文,讨论了添加连续迭代器特征的想法。目前正在考虑用于 C++1z(希望是 C++17)。

在它下,您可以执行std::is_contiguous_iterator<It>::value并获取是否It为连续迭代器。(这需要迭代器设计者的支持)。

于 2015-08-12T14:16:42.827 回答
2
typename std::iterator_traits<IteratorType>::iterator_category* = nullptr

这是没有用的,因为std::iterator_traits有一个带有非条件定义成员类型的主模板iterator_category。默认情况下,模板参数是一个迭代器,如果不是,则它违反了先决条件——因此,如果尝试使用无效实例化进行上述操作,您将不会得到 SFINAE,而是一个硬错误。

当我们直接读取一块内存时,它只有在内存中从头到尾的内存块是连续的时才会起作用。如何检查?

我不知道您会对“内存中的连续”概念提出什么确切要求。但是,您是否考虑过以下问题?

template<typename T>
bool readRawData(T* first, T* last);

前提[ first, last )是有效的指针作为迭代器范围进入数组。

如果您想提出进一步的要求T(例如,由于您使用 的可复制性很小read),您也可以表达/记录这些要求。

于 2012-09-30T03:48:50.213 回答