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

JBL*_*JBL 2 c++ templates decltype c++11

免责声明:我已经看到了这个问题,而且我正在问decltype,在接受的答案中建议如何使用它.

基本上我尝试(有点乐趣,为了方便而有点用于学习目的)来实现标准算法的小包装器,这简化了它们在应用于整个容器时的使用.其主要思想是,以摆脱.begin().end()仅仅指定必须在其上应用的算法的容器.

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

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

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

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

无法专门化功能模板''unknown-type'ragut :: count(Cnt,const T&)'

我认为这可能还不够decltype(std::count),并且假设它要求更具体的参数:

decltype(std::count<std::iterator<std::input_iterator_tag,Cnt::value_type> >)
Run Code Online (Sandbox Code Playgroud)

但这也给出了同样的错误.

我想知道它是否真的不是愚蠢而且可能做到这一点.

Rei*_*ica 5

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)))
{ }
Run Code Online (Sandbox Code Playgroud)