代码之家  ›  专栏  ›  技术社区  ›  JBL

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

  •  3
  • JBL  · 技术社区  · 12 年前

    免责声明: 我见过 this question 我正是在问 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> >)
    

    但这给出了同样的错误。

    我想知道这样做是否真的不愚蠢,是否有可能。

    2 回复  |  直到 12 年前
        1
  •  6
  •   MSalters    12 年前

    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)))
    { }
    
        2
  •  1
  •   MSalters    12 年前

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