2

免责声明:我已经看到了这个问题,而我正是在问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> >)

但这给出了同样的错误。

那么我想知道它是否真的不愚蠢并且可以这样做。

4

2 回答 2

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)))
{ }
于 2013-10-09T07:54:30.823 回答
1

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

于 2013-10-09T07:54:13.100 回答