IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++】函数模板显式具体化、显式实例化 -> 正文阅读

[C++知识库]【C++】函数模板显式具体化、显式实例化

函数模板显式具体化、显式实例化

显式实例化声明

使用foo()模板生成一个int类型的函数定义。实例化:从一个模板里出来的,大家都是一样的。

显式具体化声明

不要使用foo()模板来生成函数定义,而应该使用专门为int类型显式定义的函数定义。这些原型必须有自己的函数定义,相当于函数重载。具体化:各有各的不同。

// 函数模板
template<typename T>
void foo(T t)
{
    ...
}

// 显式具体化
template<>
void foo<char*>(char* pstr);  // 后面要给出定义,否则调用会报链接错误:函数未定义
/** 
* 等价形式
* template<>
* void foo(char* pstr);
* 两者仅能使用一种,否则会引起函数名重定义的错误
*/

// 显式实例化,foo(T t)为其生成函数定义
template void foo<int>(int i);

// 显式具体化(自己实现)
template<>
void foo<double>(double d)
{
    ...
    // 不同于函数模板的实现方式
}

// 调用
int main()
{
    int i = 10;
    double d = 1.2;
    float f = 1.4;  
    foo(f);  // 隐式实例化,调用的时候,根据实参类型,生成模板函数实例
    foo(d);  // 调用foo<double>(double d),如果没有给出定义,会报链接错误;
             // 其自身不会再去根据模板来生成实例
     
    foo(i);  // 调用foo(T t)根据int类型生成的实例foo<int>(int t)
}

编译后的汇编结果

第一个:显式实例化,在main之前,foo函数模板就为foo<int>创建了定义

第二个:显式具体化,使用double 类型重载了foo函数模板

第三个:隐式实例化,在main函数中调用时,根据实参类型实例化的模板函数

函数模板的特化必须是全特化,指定为具体某个类型。如果嵌套在类模板里,若将函数模板具体化,则需要在类内定义;若将函数模板实例化,只需将其显式实例化声明。如:

// 嵌套类模板,将函数模板具体化
template<typename T>
void eat(T t);

template<typename T>
class Cat
{
public:
    friend void eat(Cat<T>& t)
		{
		    // do something, override
		}
private:
    T food;
}
// 嵌套类模板,将函数模板实例化
template<typename T>
void eat(T t)
{
		// do something
}

template<typename T>
class Cat
{
public:
		friend void eat<> (Cat<T>& t)
private:
		T food;
}

匹配规则优先级

显式调用 > 隐式调用

具体 > 模糊

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-13 22:34:39  更:2022-04-13 22:35:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:16:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码