我有功能(实际上它是部分专业的)
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
无效,那就不是我想要的了。
那么,是否可以获得此类型?
答案 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++));