如何正确推断模板的返回类型

How to infer correctly a return type for a template?

本文关键字:返回类型 何正确      更新时间:2023-10-16

免责声明:我已经看到了这个问题,我正是在问decltype,在接受的答案中建议,可以用于此

基本上,我尝试(有点好玩,有点方便,有点学习目的(为标准算法实现小包装器,以简化它们应用于整个容器的使用。主要思想是摆脱.begin().end(),只需指定必须应用算法的容器。

然后,我想知道是否有可能(顺便说一下,这并不愚蠢(从标准算法返回类型本身推断我的包装器的返回类型。

目前,我尝试了以下方法(对于std::count(:

template<class Cnt,
         class T>
inline 
auto count(Cnt _cnt, const T& _val) -> decltype(std::count){}

但它在编译时给了我一个错误:

无法专用化函数模板"未知类型"ragut::count(Cnt,const T &('

我认为仅仅说decltype(std::count)可能还不够,并假设它要求一个更具体的参数,例如:

decltype(std::count<std::iterator<std::input_iterator_tag,Cnt::value_type> >)

但这给出了同样的错误。

我想知道这样做

是否真的不愚蠢和可能。

decltype(x) 表示表达式的类型 x 。换句话说,您正在尝试创建一个返回函数模板(在第一种情况下(或函数(在第二种情况下(的函数。那行不通。您希望调用的类型std::count,如下所示:

template<class Cnt,
         class T>
inline 
auto count(Cnt _cnt, const T& _val) 
  -> decltype(std::count(std::begin(_cnt), std::end(_cnt), _val)))
{ }

如果您指定正确的模板参数,它将起作用。在这种情况下,这些将是<typename Cnt::const_iterator, typename Cnt::value_type>