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

时间:2013-10-09 07:47:36

标签: c++ templates c++11 decltype

免责声明:我见过this question,我正好问在接受的答案中建议的decltype如何用于此。

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

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

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

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

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

  

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

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

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

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

我想知道它是否真的不是愚蠢而且可能这样做。

2 个答案:

答案 0 :(得分: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)))
{ }

答案 1 :(得分:1)

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