C++ 筛选模板函数的特定迭代器

C++ 筛选模板函数的特定迭代器,c++,templates,iterator,C++,Templates,Iterator,我正在开发一组函数,利用具有打包和顺序内存存储(用于内存拷贝)的容器。它们具有大多数STD函数样式的函数签名,输入/输出迭代器指向元素并表示范围。例如,函数可以如下所示: template< typename InputIterator, typename OutputIterator > OutputIterator fooBar( InputIterator& first, InputIterator& last,

我正在开发一组函数,利用具有打包和顺序内存存储(用于内存拷贝)的容器。它们具有大多数STD函数样式的函数签名,输入/输出迭代器指向元素并表示范围。例如,函数可以如下所示:

template< typename InputIterator, typename OutputIterator >
OutputIterator fooBar( InputIterator& first, InputIterator& last, 
                       OutputIterator& result );
template
输出计算器fooBar(输入计算器&第一个,输入计算器&最后一个,
输出者和结果);
我希望验证传递的迭代器是合法的,即打包的和顺序的。对于STD容器,这仅限于STD::vector和STD::array。不幸的是,我不能依赖迭代器的“category”特性,因为随机访问特性并不意味着序列存储。这方面的一个例子是microsofts concurrent_vector类,这里有文档记录

此外,我也不能接受vector和array类中的所有迭代器,例如,我需要拒绝反向迭代器,std::vector
迭代器不合适,因为它使用的是代理类

我试图创建自己的traits类来区分和过滤具有我上面描述的约束的迭代器,但是我遇到了模板语法问题。我正在寻求其他人对他们如何处理这个问题的反馈


谢谢

我想你做不到这一点。迭代器是一种抽象,其全部目的是使迭代过程独立于底层架构。标准迭代器中没有表示底层内存结构的信息,甚至没有任何类似的信息

在类似std算法的函数中,通常建议按值传递迭代器,因为迭代器应该是便宜/小的对象。应该特别注意的是,您的函数永远不能被称为
fooBar(c.begin(),c.end(),some out它),因为它通过引用非常量来获取输入迭代器


最后一点,您可以通过测试迭代器类型是否是
std::reverse_iterator
的专门化来筛选出反向迭代器,因为至少标准容器的
容器::(const_)reverse_iterator
类型必须是一个。

我认为您不能这样做。迭代器是一种抽象,其全部目的是使迭代过程独立于底层架构。标准迭代器中没有表示底层内存结构的信息,甚至没有任何类似的信息

在类似std算法的函数中,通常建议按值传递迭代器,因为迭代器应该是便宜/小的对象。应该特别注意的是,您的函数永远不能被称为
fooBar(c.begin(),c.end(),some out它),因为它通过引用非常量来获取输入迭代器


最后一点,您可以通过测试迭代器类型是否是
std::reverse_iterator
的专门化来过滤掉反向迭代器,因为至少标准容器的
容器::(const_)reverse_iterator
类型必须是一个。

您还需要注意
值_type
。只有POD可以
memcpy
'd。通常,大多数std库已经尝试优化
std::copy
memmove
,如果可能的话,为什么不直接使用它呢?这个库的本质就是提供POD。它随域而来。如果有人感兴趣,我可以详细说明,但我试图尽可能笼统地陈述我的问题。您还需要注意
值\u类型
。只有POD可以
memcpy
'd。通常,大多数std库已经尝试优化
std::copy
memmove
,如果可能的话,为什么不直接使用它呢?这个库的本质就是提供POD。它随域而来。如果有人感兴趣的话,我可以详细说明,但我尽量笼统地陈述我的问题。谢谢你的回答。我正在研究的方法包括创建一个“新的”traits类,所以我想将我自己的信息添加到迭代器中。与iterator_traits类现在的工作方式非常相似,我只需要确保iterator_traits是为我关心的迭代器定义的,这允许用户创建自己的迭代器并添加自己的trait元数据。你能给我看一下迭代器传递值的文档吗?我对此不熟悉。此外,为什么输入迭代器必须是const?@ Kent:我认为您需要阅读关于C++中如何传递参数的一个很好的读法。代码>无效foo1(int)按值获取
int
<代码>无效foo2(int&)
通过引用获取一个
int
,该引用是非
const
。现在,假设您有一个函数
intbar(),返回一个int by值(这是一个临时值)。不能调用
foo2(bar())
,因为临时变量不能绑定到对非常量的引用。希望这有助于更好地理解这件事。谢谢你的提示。事实证明,Microsoft编译器接受对非常量的引用,但这不是符合标准的行为。@Kent:正确,MSVC在这方面太宽容了。谢谢你的回答。我正在研究的方法包括创建一个“新的”traits类,所以我想将我自己的信息添加到迭代器中。与iterator_traits类现在的工作方式非常相似,我只需要确保iterator_traits是为我关心的迭代器定义的,这允许用户创建自己的迭代器并添加自己的trait元数据。你能给我看一下迭代器传递值的文档吗?我对此不熟悉。还有,为什么输入迭代器必须是常量?@Kent:我想你需要好好了解参数p是如何工作的