重载功能模板

时间:2014-07-10 03:52:55

标签: c++ stl

在阅读书籍C ++模板:完整指南中的重载功能模板时,我遇到了以下示例:

// maximum of two values of any type 
template <typename T> 
inline T const& max (T const& a, T const& b) 
{ 
    return a < b ? b : a; 
} 

// maximum of two pointers 
template <typename T> 
inline T* const& max (T* const& a, T* const& b) 
{ 
    return *a < *b ? b : a; 
} 

// maximum of two C-strings 
inline char const* const& max (char const* const& a, 
                               char const* const& b) 
{ 
    return std::strcmp(a,b) < 0 ? b : a; 
} 

int main () 
{ 
    int a=7; 
    int b=42; 
    ::max(a,b);      // max() for two values of type int 

    std::string s="hey"; 
    std::string t="you"; 
    ::max(s,t);      // max() for two values of type std::string 

    int* p1 = &b; 
    int* p2 = &a; 
    ::max(p1,p2);    // max() for two pointers 

    char const* s1 = "David"; 
    char const* s2 = "Nico"; 
    ::max(s1,s2);    // max() for two C-strings 
} 

我没有得到char const * const&amp;的含义和目的。用于普通max函数的返回类型以及参数类型。即使我们使用char const *也工作正常。

3 个答案:

答案 0 :(得分:0)

RE

  

我没有得到char const * const&amp;的含义和目的。用于普通max函数的返回类型以及参数类型。即使我们使用char const *也可以正常工作。

它可以在书中解释(然后它是出于教学目的,只是一个不好的例子),或者它可能是明显的愚蠢。

没有充分的理由不仅仅使用char const* const,甚至只是char const*,如果你不关心严格应用指导规则,或者只是没有const这样的规则1}}关于形式论证。


如果它是教学法,那么请注意所有三个重载都具有形式的形式参数类型,即T const&

这可以在你想要的时候提供帮助,例如从模板代码中获取其中一个地址。

我之所以提到这一点,是因为这本书是由Josuttis和Vandevorde(Daveed)写的,他们很少会愚蠢。

答案 1 :(得分:0)

由于您在本书的函数模板和重载解析部分中找到了这一点,因此示例的目的是说明为重载解析选择哪些函数。为了推动非模板化函数首先被考虑的点,无论模板化函数匹配得多好,它们都构造了char const* const&的最大例子。相反,如果函数签名是char const*,那么它将没有任何说明目的 - 模板化函数都不匹配。

答案 2 :(得分:0)

是的,实际上通过const引用返回指针是没有意义的。

但是这是本书关于函数模板重载的部分,我认为它只是用于拟合函数模板max的返回值的定义,它是一个const引用T const&。因此,正常max函数(对于类型char const*)的返回值应为char const* const&