C++中用函數(shù)模板實(shí)現(xiàn)和優(yōu)化抽象操作

字號(hào):

本文介紹函數(shù)模板的概念、用途以及如何創(chuàng)建函數(shù)模板和函數(shù)模板的使用方法......
    在創(chuàng)建完成抽象操作的函數(shù)時(shí),如:拷貝,反轉(zhuǎn)和排序,你必須定義多個(gè)版本以便能處理每一種數(shù)據(jù)類型。以 max() 函數(shù)為例,它返回兩個(gè)參數(shù)中的較大者:
    double max(double first, double second);
    complex max(complex first, complex second);
    date max(date first, date second);
    //..該函數(shù)的其它版本
    盡管這個(gè)函數(shù)針對(duì)不同的數(shù)據(jù)類型其實(shí)現(xiàn)都是一樣的,但程序員必須為每一種數(shù)據(jù)類型定義一個(gè)單獨(dú)的版本:
    double max(double first, double second)
    {
    return first>second? first : second;
    }
    complex max(complex first, complex second)
    {
    return first>second? first : second;
    }
    date max(date first, date second)
    {
    return first>second? first : second;
    }
    這樣不但重復(fù)勞動(dòng),容易出錯(cuò),而且還帶來很大的維護(hù)和調(diào)試工作量。更糟的是,即使你在程序中不使用某個(gè)版本,其代碼仍然增加可執(zhí)行文件的大小,大多數(shù)編譯器將不會(huì)從可執(zhí)行文件中刪除未引用的函數(shù)。
    用普通函數(shù)來實(shí)現(xiàn)抽象操作會(huì)迫使你定義多個(gè)函數(shù)實(shí)例,從而招致不小的維護(hù)工作和調(diào)試開銷。解決辦法是使用函數(shù)模板代替普通函數(shù)。
    使用函數(shù)模板
    函數(shù)模板解決了上述所有的問題。類型無關(guān)并且只在需要時(shí)自動(dòng)實(shí)例化。本文下面將展示如何定義函數(shù)模板以便抽象通用操作,示范其使用方法并討論優(yōu)化技術(shù)。
    第一步:定義
    函數(shù)模板的聲明是在關(guān)鍵字 template 后跟隨一個(gè)或多個(gè)模板在尖括弧內(nèi)的參數(shù)和原型。與普通函數(shù)相對(duì),它通常是在一個(gè)轉(zhuǎn)換單元里聲明,而在另一個(gè)單元中定義,你可以在某個(gè)頭文件中定義模板。例如:
    // file max.h
    #ifndef MAX_INCLUDED
    #define MAX_INCLUDED
    template <class T> T max(T t1, T t2)
    {
    return (t1 > t2) ? t1 : t2;
    }
    #endif