STL的常用定义输出迭代器,像这样:输出迭代器的VALUE_TYPE
template<class Cont>
class insert_iterator
: public iterator<output_iterator_tag,void,void,void,void> {
// ...
为什么输出迭代定义value_type
为void
?算法知道它应该输出什么类型的值是很有用的。
例如,将URL查询"key1=value1&key2=value2&key3=value3"
转换为包含键值字符串元素的任何容器的函数。
template<typename Ch,typename Tr,typename Out>
void parse(const std::basic_string<Ch,Tr>& str, Out result)
{
std::basic_string<Ch,Tr> key, value;
// loop over str, parse into p ...
*result = typename iterator_traits<Out>::value_type(key, value);
}
SGI reference page of value_type
提示这是因为无法取消引用输出迭代器。但这不是value_type
的唯一用途:我可能想要实例化一个以将其分配给迭代器。
有什么替代方法可以用输出迭代器构造输出值?我考虑过的两种方法:
- 接受函数参数,该函数参数将返回正确类型的对象。我仍然想要一个没有使用该函数对象参数的算法版本。
- 要求输出容器容纳
pair<string,string>
,否则就是可以从中转换的类型。我想知道如果没有这个要求我可以做什么,也许允许任何可以从两个std::string
构建的元素。
我试图做的是概括的算法,使得它适用于任何类型的容器,可以从两个'string'小号构建,而不仅仅是'地图<字符串,字符串>'。然后,模板可以实例化为'* result = pair(key,value)'以及'* result = unicorn_pony(key,value)''。 –
wilhelmtell
2010-04-12 02:47:07
如果我可以添加一个引用:关于输出迭代器的论文[pdf],也会抱怨这个问题。 http://semantics.org/publications/02_02_multiout.pdf – wilhelmtell 2010-04-12 05:16:34
该论文给出的例子正是为什么输出迭代器不需要定义值类型。他任意决定'MultiOut :: value_type'应该是'double',但实际上*可以隐式转换为'double'和'int'的任何*类型都是用于赋值运算符的合理值。 – 2010-04-12 07:01:41