函數模板的簡單使用

#include <iostream>

using namespace std;

inline int const & max(int const & a, int const & b)
{
    cout << "inline int const & max\n";
    return a > b ? a : b;
}

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

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

int main()
{
    cout << 1 << endl;  ::max(7, 42, 63);//max<int>

    cout << 2 << endl;  ::max(7.0, 42.0);// max<double>

    cout << 3 << endl;  ::max('a', 'b');// max<char>

    cout << 4 << endl;  ::max(7, 42);//int重載的非模板函數

    cout << 5 << endl;  ::max<>(7, 42);//max<int>

    cout << 6 << endl;  ::max<double>(7, 42);//max<double>

    cout << 7 << endl;  ::max('a', 42.7);//int重載的非模板函數
    /*
    一個非模板函數可以和一個同名的函數模板同時存在,而且該函數模板還可以被實例化爲這個非模板函數。
    對於非模板函數和同名的函數模板,如果其他條件都是相同的話,那麼在調用的時候,重載解析過程就會
    調用非模板函數,而不會從該模板產生出一個實例。

    然而,如果模板可以產生出一個具有更好匹配的函數,那麼就選擇模板。

    還可以顯示地只是一個空的模板實參列表,告訴編譯器,只有模板才能來匹配這個調用,而且所有的模板都
    應該根據模板參數來調用實參演繹出來。

    模板不允許自動類型裝換。
    */
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章