返回类型的模板参数缩减

template-argument-reduction for return type

本文关键字:参数 返回类型      更新时间:2023-10-16

我有这个函数:

std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> > 
split(    const std::vector<int>& vector,size_t slices){
...
}

由于它非常冗长,而且我将来可能需要拆分其他类型的向量,我想使它基于模板,但这次尝试失败了:

 template<typename T> 
  std::vector<std::pair< std::vector<T>::iterator, std::vector<T>::iterator> >
  split( const std::vector<T>& vector, size_t slices) 
    ...
 }

我所看到的有两个问题:1-我不能使用矢量、地图或列表,只能使用矢量。2-我还不太了解模板缩减的内容。

感谢任何解释。

1-我不能使用矢量或地图或列表,〔…〕

如果您想通用地处理所有容器,那么首先不应该使用std::vector模板(也不应该将函数参数命名为vector(:

template<typename C>
std::vector<std::pair<typename C::iterator, typename C::iterator>>
split(C const& cont, size_t slices)
{
    ...
}

还要注意typename关键字的使用,这在指定限定的依赖类型名称时是必要的。

template<typename T> 
  std::vector<std::pair< typename T::iterator, typename T::iterator> >
  split( const T& vector, size_t slices) 
    ...
 }

您缺少typename,可以替换容器的类型。

您缺少typename:

template<typename T>
std::vector<
    std::pair<
        typename std::vector<T>::iterator,
        typename std::vector<T>::iterator
    >
>
split( const std::vector<T>& vector, size_t slices)
{ /* ... */ }

请参阅我必须将";模板";以及";typename";关键词?有关CCD_ 6的更多信息。