gpt4 book ai didi

c++ - 为什么 back_insert_iterator/front_insert_iterator/insert_iterator 的 value_type/difference_type/pointer/reference 都是 void?

转载 作者:IT老高 更新时间:2023-10-28 21:57:47 26 4
gpt4 key购买 nike

在我的项目中,我想将流拆分为一些给定类型的值,所以我实现了一个模板函数

template <typename TElem, typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
TElem elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}

我认为这很尴尬,因为我必须在调用时明确给出 TElem 的类型。例如,我必须写:

std::vector<int> v;
SplitSpace<int>(std::cin, back_inserter(v));
// I want to it to be SplitSpace(std::cin, back_inserter(v));

我尝试从(模板)迭代器中获取值类型,并使用 std::iterator_traits 如下:

template <typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
typename std::iterator_traits<TOutputIter>::value_type elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}

但是,上述代码不适用于 back_insert_iterator。我检查了 std 命名空间中 back_insert_iterator/front_insert_iterator/insert_iterator 的源代码,发现 value_type/difference_type/pointer/reference 都是 无效

我想知道为什么这些类型都是void,有什么考虑吗?另一个问题是,是否可以实现 SplitSpace 函数,而无需在调用时明确给出元素类型?谢谢。

最佳答案

value_type在 OutputIterators 的情况下没有多大意义,因为输出迭代器不能访问任何值,更重要的是它可以接受广泛的值类型。

对 OutputIterator 的唯一要求 it是它必须支持表达式*it = o 在哪里 o是某个类型的值,它位于可写入 i 的特定迭代器类型的类型集中(第 24.2.1 节)。这意味着输出迭代器可以潜在地接受多种类型:例如,它的 operator*可以返回一个重载的代理对象 operator=适用于多种类型;应该是value_type在这种情况下?

例如,考虑以下输出迭代器:

struct SwallowOutputIterator : 
public std::iterator<output_iterator_tag, void, void, void, void>
{
struct proxy // swallows anything
{
template <typename T>
void operator=(const T &) {}
};

proxy operator*()
{
return proxy();
}

// increment operators
};

value_type 没有明智的选择在这里。

同样的道理也适用于 pointerreference_type . difference_type未定义,因为您无法计算两个输出迭代器之间的距离,因为它们是单程的。

注意:标准明确指出 insert_iterator并且它的兄弟必须继承自 iterator<output_iterator_tag, void, void, void, void> ,所以这不是您的实现的特殊性。

关于c++ - 为什么 back_insert_iterator/front_insert_iterator/insert_iterator 的 value_type/difference_type/pointer/reference 都是 void?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16165635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com