获取我可能分配给dereferenced iterator的类型

时间:2013-03-08 09:07:09

标签: c++ c++11 iterator

我有功能(实际上它是部分专业的)

template<typename T>
T generate(){

}

要使用它,我必须隐式输入模板类型,例如

int v = generate<int>();

现在我想编写函数,它使用此函数获取输出迭代器并生成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无效,那就不是我想要的了。

那么,是否可以获得此类型?

2 个答案:

答案 0 :(得分:3)

输出迭代器故意不需要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

答案 1 :(得分:2)

如果您可以更改generate()以将引用作为输出参数而不是使用返回值,那么编译器可以根据您传入的内容计算出类型的类型,例如:

template<typename T>
void generate(T &value)
{
    value = ...;
}

int v;
generate(v);

generate(*(it++));