類模板作為函數參數以及作為類模板參數的一個簡單示例


類模板作為函數參數以及作為類模板參數的一個簡單示例

 

#include <iostream>
#include <string>

// 類模版
template <typename T>
class man
{
public:
    man(T t): name(t)
    {

    }

    void printName()
    {
        std::cout << name << std::endl;
    }

    // 類模版的友元函數聲明
    template <typename Q>
    friend void fprintMan(man<Q> & m);

    // 類模版的友元類聲明
    template <typename Q>
    friend class printClass;

private:
    T name;
};

// 類模版的友元函數定義
template <typename Q>
void fprintMan(man<Q> & m) // 注意: 模板類必須實例化 內部實例化 man<Q>
{
    m.printName();
}

// 類模版的友元類定義
template <typename Q>
class printClass
{
public:
    void print(man<Q> & my) // 注意: 模板類必須實例化 內部實例化 man<Q>
    {
        my.printName();
    }
};

// 類模版作為函數參數
template <typename T>
void printMan(man<T> & m) // 注意: 模板類必須實例化 內部實例化 man<T>
{
    m.printName();
}

// 類模版作為模版參數
template <typename T1, template <typename T> class T2>
class people
{
public:
    void printPeople(T2<T1> t1) // 注意: 模板類必須實例化 內部實例化 T2<T1>
    {
        t1.printName();
    }
};

// 函數模版
template <typename T>
T addTemplate(T x, T y)
{
    return (x + y);
}

// 函數模版作為函數的參數
template <typename T>
void printAdd(T (*p)(T, T), T x, T y) // 注意: 模版函數的指針必須實例化 外部實例化
{
    std::cout << (*p)(x, y) << std::endl;
}

// 函數模版作為類的參數
template <typename T>
class addclass
{
public:
    void printAddFun(T (*p)(T, T), T x, T y) // 注意: 模版函數的指針必須實例化 外部實例化
    {
        std::cout << (*p)(x, y) << std::endl;
    }
};


int main()
{
    man<std::string> man1("hello"); // 類模版實例化對象
    man1.printName();

    fprintMan(man1); // 類模版的友元函數

    printClass<std::string> print1; // 類模版的友元類
    print1.print(man1);

    printMan(man1); // 類模版作為函數參數

    people<std::string, man> people1;
    people1.printPeople(man1); // 類模版作為模版參數

    std::cout << addTemplate(3, 4) << std::endl;  // 函數模版實例化
    std::cout << addTemplate(7.7, 9.5) << std::endl;

    printAdd<int>(addTemplate, 10, 54); // 函數模版必須實例化

    addclass<int> addclass1;
    addclass1.printAddFun(addTemplate, 10, 54);  // 函數模版作為類的參數

    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM