在我的项目中,我想将流拆分为某种给定类型的值,因此我将模板函数实现为
template <typename TElem, typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
TElem elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
我认为这很尴尬,因为我必须TElem
在调用它时明确给出类型。例如,我必须写:
std::vector<int> v;
SplitSpace<int>(std::cin, back_inserter(v));
// I want to it to be SplitSpace(std::cin, back_inserter(v));
我试图从(模板)迭代器中获取值类型,std::iterator_traits
并按如下方式使用:
template <typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
typename std::iterator_traits<TOutputIter>::value_type elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
但是,上述代码不适用于back_insert_iterator
. back_insert_iterator/front_insert_iterator/insert_iterator
我检查了命名空间中的源代码,std
发现value_type/difference_type/pointer/reference
都是void
.
我想知道为什么这些类型都是void
,有什么考虑吗?另一个问题是,是否可以在SplitSpace
调用时不显式给出元素类型来实现该函数?谢谢。