0

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

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是无效的,那不是我想要的。

那么,有没有办法获得这种类型?

4

2 回答 2

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
于 2013-03-08T09:27:13.843 回答
2

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

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

.

int v;
generate(v);

.

generate(*(it++));
于 2013-03-08T09:15:21.367 回答