![](/img/trans.png)
[英]How to use derived type in specialisation of return-type function template? (“couldn't infer template argument”)
[英]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.