簡體   English   中英

獲取我可能分配給解引用迭代器的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM