当前位置: 首页 > wzjs >正文

重庆在线开放平台seo网站推广批发

重庆在线开放平台,seo网站推广批发,秦皇岛哪里做网站,dns网站建设深入理解C模板:从原理到实践 引言1、模板基础知识1.1 函数模板1.2 类模板 2、模板实例化机制2.1 两阶段编译2.2 实例化控制 3、模板参数推导3.1 类型推导规则3.2 CTAD(类模板参数推导) 4、模板特化与偏特化4.1 全特化4.2 偏特化 5、模板元编程…

深入理解C++模板:从原理到实践

  • 引言
  • 1、模板基础知识
    • 1.1 函数模板
    • 1.2 类模板
  • 2、模板实例化机制
    • 2.1 两阶段编译
    • 2.2 实例化控制
  • 3、模板参数推导
    • 3.1 类型推导规则
    • 3.2 CTAD(类模板参数推导)
  • 4、模板特化与偏特化
    • 4.1 全特化
    • 4.2 偏特化
  • 5、模板元编程
    • 5.1 编译时计算
    • 5.2 SFINAE与类型检查
    • 5.3 C++20概念(Concepts)
  • 6、模板实践建议

引言

C++模板是泛型编程的核心工具,它允许开发者编写与类型无关的代码。然而,模板的实现机制和编译过程往往令人感到神秘。本文将通过模板实例化过程类型推导规则模板元编程三个维度,深入理解C++模板的工作原理。

1、模板基础知识

1.1 函数模板

template <class T>
void Swap(T& a, T& b) {T temp = a;a = b;b = temp;
}
  • 编译器通过调用上下文推导T的类型。
  • 生产具体类型版本的过程成为隐式实例化
template <class T>
void Swap(T& a, T& b) {T temp = a;a = b;b = temp;
}int main() {int a = 1, b = 2;std::cout << a << " " << b << std::endl;Swap(a, b);std::cout << a << " " << b << std::endl;std::cout << "---------" << std::endl;double c = 1.2, d = 3.4;std::cout << c << " " << d << std::endl;Swap(c, d);std::cout << c << " " << d << std::endl;return 0;
}

自动推导类型

自动推导类型

1.2 类模板

template <class T>
class Vector {
public:Vector(int n = 5): size_(0), capacity_(n){data_ = new T[n];}void PushBack(const T& item) {// 尾插逻辑...}~Vector() {delete[] data_;size_ = capacity_ = 0;}
private:T* data_;int size_;int capacity_;
};
  • 必须显式指定模板参数类型(C++17前)。
  • 支持成员函数模板和静态成员。
template <typename T>
class Vector {
public:Vector(int n = 5): size_(0), capacity_(n){data_ = new T[n];}void PushBack(const T& item) {// 尾插逻辑...}~Vector() {delete[] data_;size_ = capacity_ = 0;}
private:T* data_;int size_;int capacity_;
};int main() {Vector<int> v;return 0;
}

typename是用来定义模板参数的关键字,也可以使用class

2、模板实例化机制

2.1 两阶段编译

  1. 模板定义阶段:检查语法和与模板参数无关的错误。
  2. 实例化阶段:生产具体类型的代码,检查类型相关操作。

模板实例化

2.2 实例化控制

  • 显示实例化(减少代码膨胀)。
template <class T>
void Swap(T& a, T& b) {T temp = a;a = b;b = temp;
}template <class T>
class Vector {
public:Vector(int n = 5): size_(0), capacity_(n){data_ = new T[n];}void PushBack(const T& item) {// 尾插逻辑...}~Vector() {delete[] data_;size_ = capacity_ = 0;}
private:T* data_;int size_;int capacity_;
};template class Vector<int>; // 显示实例化整个类
template void Swap<int>(int&, int&); // 显示实例化函数
  • 外部实例化声明(C++11)。
extern template class Vector<int>;

3、模板参数推导

3.1 类型推导规则

  • 函数模板参数推导遵循以下优先级:
    1. 完美匹配。
    2. 类型提升(float → \rightarrow double)。
    3. 标准转换(int → \rightarrow long)。
    4. 用户定义转换。

3.2 CTAD(类模板参数推导)

  • C++17引入的自动推导机制。
std::vector v{1,2,3}; // 推导为std::vector<int>

4、模板特化与偏特化

4.1 全特化

template <>
class ClassName<void*> {//针对void*类型的特殊实现
};

4.2 偏特化

template <class T>
class ClassName<T*> {//针对所有指针类型的通用实现
};

5、模板元编程

5.1 编译时计算

template <int N>
struct Factorial {static const int ret = N * Factorial<N - 1>::ret;
};template <>
struct Factorial<0> {static const int ret = 1;
};int main() {std::cout << Factorial<5>::ret << std::endl; // 120return 0;
}

5.2 SFINAE与类型检查

template <class T>
class std::enable_if<std::is_integral<T>::value>::type process(T val) {// 仅对整数类型生效的实现
}

5.3 C++20概念(Concepts)

template <class T>
requires std::floating_point<T>
T precise_calc(T a, T b) {// 高精度浮点计算
}

6、模板实践建议

  1. 避免过度使用模板元编程(TMP)。
  2. 使用static_assert进行模板参数校验。
  3. 注意模板导致的代码膨胀问题。
  4. 有限选择标准库类型特征(type_traits)
http://www.dtcms.com/wzjs/124956.html

相关文章:

  • 那个网站做外贸好网站收录查询爱站
  • 怎么做同城商务网站网络运营师
  • 天津网站建设品牌推广网站搜索引擎优化方法
  • seo网站建设 厦门宁德市蕉城区
  • 领优惠券的网站是怎么做的厦门seo顾问
  • 哈尔滨网站优化对策seo网络推广教程
  • 海南网站开发网络营销事件
  • 中国做的比较好的网站设计公司有哪些长沙哪家网络公司做网站好
  • 台州网站建设百度网站推广费用
  • 企业百度网站怎么做网络广告策划流程有哪些?
  • 建设自己的网站首页google浏览器下载安装
  • 南宁网站关键字优化小熊代刷推广网站
  • 网站推广计划书包含哪些内容百度网盘首页
  • 怎么添加网站程序广州建网站的公司
  • 胶州家园网站建设网盟推广是什么意思
  • 陇南市建设局网站网络舆情监测
  • 美国服务器ip地址免费网站seo视频狼雨seo教程
  • 做网站包括图片设计吗谷歌google官网下载
  • 桐乡网站二次开发怎样建网站
  • 局域网内服务器做网站网络推广外包内容
  • 龙海市城乡规划建设局网站免费域名申请
  • 小程序商城模板免费在线刷seo
  • 网站制作方案书销售人员培训课程有哪些
  • 福州企业高端网站建设制作哪家好宁波seo关键词优化
  • 论坛网站制作费用2023年8月份新冠
  • 届毕业设计代做网站店铺运营方案策划
  • 贵阳工程建设招聘信息网站独立站seo优化
  • 五年级信息做网站的软件bing搜索 国内版
  • 网址免费生成app东莞关键字排名优化
  • 用xp做网站是否先搭建iiskol营销模式