大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C++技巧 > C++函数模板详细讲解

C++函数模板详细讲解(2)

关键词:函数模板C++  阅读(1354) 赞(13)

[摘要]本文是对C++函数模板的讲解,对学习C++编程技术有所帮助,与大家分享。

template<typename T1, typename T2, typename RT>
inline RT max(T1 const& a, T2 const& b);
...
max<int, double, double>(4, 4.2);

行得通,但是很麻烦

还有一种方法是只显示的指定第一个实参,而让演绎过程推导出其余的实参。

template<typename RT, typename T1, typename T2>
inline RT max(T1 const& a, T2 const& b);
...
max<double>(1, 4.2);  //ok, 返回类型是double

重载函数模板

和普通函数一样,函数模板也可以被重载,示例代码如下:

#include<iostream>
#include<string>
using namespace std;

inline int const& max(int const& a, int const& b)
{
    return a < b ? b : a;
}

template<typename T>
inline T const& max(T const& a, T const& b)
{
    return a < b ? b : a;
}

template<typename T>
inline T const& max(T const& a, T const& b, T const& c)
{
    return ::max(::max(a, b), c);
}

int main()
{
    cout<<::max(7, 12, 67)<<endl;       //调用具有3个函数的模板
    cout<<::max(7.9, 34.5)<<endl;       //调用max<double>(通过实参演绎)
    cout<<::max('a', 'y')<<endl;        //调用max<char>(通过实参演绎)
    cout<<::max(7, 42)<<endl;           //调用int重载的非模板函数
    cout<<::max<>(7, 23)<<endl;         //调用max<int>(通过实参演绎)
    cout<<::max<double>(4, 45)<<endl;   //调用max<double>(没有实参演绎)
    cout<<::max('a', 23.4)<<endl;       //调用int重载的非模板函数

    cin.get();  
    return 0;
}

下面的更有用的例子将会为指针和普通的C字符串重载这个求最大值的模板:

#include<iostream>
#include<string>
using namespace std;

//求两个任意类型值的最大者
template<typename T>
inline T const& max(T const& a, T const& b)
{
    return a < b ? b : a;
}

//求两个指针所指向值的最大者
template<typename T>
inline T* const& max(T* const& a, T* const& b)
{
    return a < b ? b : a;
}

//求两个C字符串的最大者
inline char const* const& max(char const* const& a, char const* const& b)
{
    return *a < *b ? b : a;
}

int main()
{
    int a, b;
    a = 7;
    b = 42;
    ::max(a, b);   //max()求两个int值的最大值
     
    string s = "hey";
    string t = "you";
    cout<<::max(s, t)<<endl;   //max()求两个string类型的最大值

    int* p1 = &b;
    int* p2 = &a;
    cout<<::max(p1, p2)<<endl;  //max()求两个指针所指向值的最大值

    char const* s1 = "Davide";
    char const* s2 = "Nico";
    cout<<::max(s1, s2)<<endl;  //max()求两个c字符串的最大值

    cin.get();  
    return 0;
}

以上在所有实现重载里面,都是通过引用来传递每个实例的,但是一般而言,在重载函数模板的时候,最好只是改变那些需要改变的内容,应该把改变限制在以下两个方面:



相关评论