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