[英]Get type that I may assign to dereferenced iterator
我有功能(實際上是部分專業的)
template<typename T>
T generate(){
}
要使用它,我必須隱式地鍵入模板類型,例如
int v = generate<int>();
現在,我想編寫一個函數,該函數獲取Output迭代器並使用此函數生成n
值。
template<typename OI>
fill(size_t n, OI it){
for(size_t i = 0; i < n; ++i){
*(it++) = generate<__TYPE???__>();
}
}
我知道對於具有實際值的迭代器,該值被指出,其中有value_type
來顯示它。 但是,如果我得到例如back_insert_iterator
value_type
為空,那不是我想要的。
那么,獲得這種類型的方法嗎?
輸出迭代器故意不需要具有value_type
。 您無法自動檢索可插入序列的類型。 給定的迭代器甚至可能有幾種一流的序列類型。
一種解決方法是,僅要求與您的函數一起使用的迭代器提供value_type
成員或具有有用的* iterator
取消引用操作。 但是正如您所觀察到的, std::back_insert_iterator
未能滿足這些要求。
更好的選擇是采用兩個模板參數。
template<typename T, typename OI>
fill(size_t n, OI it);
這不允許扣除T
,因此您需要
fill< int >( intvec.size(), std::back_inserter( intvec ) );
// ^^^ explicit, but the iterator type is still deduced
如果您可以更改generate()
以將引用作為輸出參數而不是使用返回值,則編譯器可以根據傳入的內容算出適合您的類型,例如:
template<typename T>
void generate(T &value)
{
value = ...;
}
。
int v;
generate(v);
。
generate(*(it++));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.