美文网首页
关于模板的实例化

关于模板的实例化

作者: 404Not_Found | 来源:发表于2021-09-20 11:27 被阅读0次
  • 作者: 雪山肥鱼
  • 时间:20210921 11:02
  • 目的: 关于模板的实例化

函数模板

template <class T>
T funAdd(const T &a, const T &b)
{
  T value = a+b;
  return value
}

void func()
{
  cout<<funcAdd(1,2)<<endl;
  return;
}

T 的类型,是编译器根据funcAdd 来确定的。

编译器推断类型.PNG
函数体如果不调用函数模板的实例化,即模板函数,则不会出现任何函数模板的字样
但 如果 main不调用,其他功能函数,函数模板还是会进入编译。

类的模板

template<class T>
class ATPL
{
  T m_i, m_j;
  ATPL( T tmpi = 0, tmpj = 0)
  {
    m_i = tmpi;
    m_j = tmpj;
  }
}

void func()
{
}

如果函数没有调用这个 类模板,即没有实例化过,则不会进入编译。

类模板中的枚举

template<class T>
{
  public: 
    enum E
    {
      BUSY;
      FREE;
    }
  public:
    T m_i, m_j;
     ATPL(T tmpi =0, T tmpj = 0)
    {
        m_i = tmpi;
        m_j = tmpj;
    }
}

void func()
{
    ATPL<int>::E myEnum;
    myEnum = ATPL<int>::BUSY;

    ATPL<double>::E myEnum1;
    myEnum1 = ATPL<double>::BUSY;
}

没有什么特别的,编译器只是借用了ATPL<int>::E 中的这个枚举类型,相当于namespace 作用域。
从 obj 文件观察到,只有2个 APTL<int>, APTL<double>, 并没有实例化模板

类模板中的静态变量

    // 类模板中的静态成员
    template<class T>
    class ATPL
    {
    public:
        T m_i, m_j;
        ATPL(T tmpi = 0, T tmpj = 0)
        {
            m_i = tmpi;
            m_j = tmpj;
        }
        static int m_sti;
    };
    // 不适用,模板依然没有实例化
    template <class T> int ATPL<T>::m_sti = 10;

    void func()
    {
        //与作用域无差别, 所以 static 的地址不同,起始就是相当于两个namespace 下的静态
        ATPL<int>::m_sti = 18;
        cout << ATPL<int>::m_sti << endl;

        ATPL<double>::m_sti = 18;
        cout << ATPL<double>::m_sti << endl;

        cout << &ATPL<int>::m_sti << endl;
        cout << &ATPL<double>::m_sti << endl;
    }

理解成 int double ,两个namespace 就好。

类模板的实例化

template <class T>
    class ATPL
    {
    public:
        T m_i, m_j;
        ATPL(T tmpi = 0, T tmpj = 0)
        {
            m_i = tmpi;
            m_j = tmpj;
        }
        static int m_sti;
    };
    void func()
    {
        ATPL<int> * pobj = NULL;//未实例化
        const ATPL<int> & yobj = 0; // 构造函数允许默认参数,也允许隐式类型转换
    }

注意上述代码,一个仅仅是指针,不会发生实例化
另一个是引用 + 允许隐式类型转换,所以是属于实例化。

类模板中的成员函数

    //成员函数实例化
    template <class T>
    class ATPL
    {
    public:
        T m_i, m_j;d
        ATPL(T tmpi = 0, T tmpj = 0)
        {
            m_i = tmpi;
            m_j = tmpj;
        }

        void func1() const
        {
            cout << "func1" << endl;
        }
        void func2() const
        {
            cout << "func2" << endl;
        }
        static int m_sti;
    };
    void func()
    {
        const ATPL<int> & yobj = 0; //没调用成员函数,则没有必进入编译,然而对于虚函数来说,无论是否调用都会进入编译,因为有虚函数就会有虚函数表。
        yobj.func1();//进入编译
    }

模板的编译是非常耗时的。如果其他文件中有定义模板,我想在当前文件中只让某一个成员函数进入编译,或者只想实例化某种类。则如下:

template class ATPL<int>; //如果其他文件中有定义ATPL这个类
template class ATPL<int>::func1()//仅让 func1 进入编译

相关文章

  • 【C++ Templates(13)】实例化

    On-Demand实例化(隐式实例化/自动实例化) 编译器遇到模板特化时会用所给的实参替换对应的模板参数,从而产生...

  • ★07.关于类模板

    简述 类模板:是类类型的模板,如:vector。 模板类:类模板的实例化,如:vector 。 类模板的模板参数无...

  • 23章 模板

    Note 23.1 简单字符串 模板 1 模板 定义 2 模板 实例化: 模板 + 模板实参列表 ( -> com...

  • 13 实例化

    On-Demand 实例化(隐式实例化) 编译器遇到模板特化时会用所给的实参替换对应的模板参数,从而产生特化 如果...

  • 14/11

    类模板具体化: 定义:编译器使用模板生成特定类型的类对象; 1.隐式实例化 第一步:是隐式实例化; 第二步:创建...

  • 使用Nunjucks

    Nunjucks模板引擎的使用涉及三个对象: 实例化Enviroment对象,即创建env对象 模板(html文件...

  • C++模板与泛型 --- using定义模板别名,显式指定模板参

    上一节我们学习了 成员函数模板,显式实例化、声明,通过上一节的学习,大家对 成员函数模板,显式实例化、声明有一个比...

  • Python - 杂

    一. 10.12 1.创建实例的模板 - 类;创建类的模板 - 元类 2.实例化其实是创建了一个空的对象,如果要想...

  • string in c++

    string 类是 STL 中 basic_string 模板实例化得到的模板类。其定义如下:typedef ba...

  • STL与泛型编程(geekband)

    1.定义模板 1.1函数模板template<模板参数列表>返回值 函数名(形参列表) 实例化函数模板通过形参列表...

网友评论

      本文标题:关于模板的实例化

      本文链接:https://www.haomeiwen.com/subject/fjpbgltx.html