c++笔记——类模板

类模板的几个简单测试例程

几个要点:

(1)类模板类型,在实例化时需要显式类型名称

(2)已经显式类型后,传入的参数如果不是相应类型,则会发生强制转换

(3)在类外定义的成员函数,需要加上模板参数列表和类作用域,且类作用域带类型列表

(4)多个参数模板时,可以在函数中使用其中若干个,不用全部都使用。

(5)用using来重命名一个模板

//
// Created by ht on 2023/4/17.
//

#ifndef TEST_THREAD_TEST_CLASS_H
#define TEST_THREAD_TEST_CLASS_H

#include <iostream>
#include <vector>
#include<typeinfo>
#include<cxxabi.h>
using namespace std;

template <typename T>
class A{
public:
    A() = default;
    ~A() = default;

    void fun(T a);


};

template<typename T>
void A<T>::fun(T a) {
    cout << "a = " << a << endl;
}

template<typename M, typename N>
class B{
public:
    B(){
        cout << "this is B constor" << endl;
    }

    ~B() = default;

    M a;
    N b;
    void fun2(M m, N n, int c){
        cout << "this is fun2 " << endl;
    }

    void fun3(int k, N t);
};

//这里还需要在fun3前面加上类型模板和类型作用域,也支持只传一个类模板参数,且会执行隐式类型转换
template<typename M, typename N>
void B<M, N>::fun3(int k, N t) {
    cout << "this is fun3 " << endl;
    cout << "N t = " << t << endl;

    cout << "N type : "<< abi::__cxa_demangle(typeid(t).name(),0,0,0 ) << endl;
}


//由于类模板不是一个类型,不能定义一个typedef引用一个模板
template <typename T> using twin = pair<T, T>;

#endif //TEST_THREAD_TEST_CLASS_H

 

 

主函数

#include "test_class.h"
int main(){

//class template
    //A a;//错误
    A<int> a;  //需要显式模板类型
    a.fun(3);

    //测试多个类型模板参数
    B<int, double> b;
    b.a = 1;
    b.b = 2.1;
    //这里b定义的第二参数是double,但是当传入整形2时,会发生类型转换成double
    b.fun3(2, 2);

    //测试using
    twin<string> author("huang", "ting");

    return 0;
}

 

posted @ 2023-04-17 10:46  水水滴答  阅读(14)  评论(0编辑  收藏  举报