繁体   English   中英

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

[英]How to infer correctly a return type for a template?

免责声明:我已经看到了这个问题 ,我只是在问如何将接受的答案中建议的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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM