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

C++模板元编程

C++模板元编程

为什么需要模板函数?

  • 避免重复写代码

模板函数定义

  • 使用template <class T> 或者template <typename T>
  • 其中T是可以变成任何类型
  • 调用时候T会替换成需要的类型 twice<int>会将T替换成int
template <class T>
T twice(T t)
{return T * 2;
}int main()
{std::cout << twice<int>(2) << std::endl;
}

除此之外,C++规定,当模板类型参数T作为函数参数时,可以省略该模板参数。自动根据调用者的参数去判断类型

模板参数默认类型

如果模板参数返回了T类型,且没有出现再参数中,那么编译器无法推断T的类型,这个时候我们不得不指定类型。但是,我们也可以通过template <class T = int>这种方式表示T的默认类型是int

template <class T = int>  
T two()
{return  2;
}int main()
{std::cout << two(2) << std::endl;
}
  • 除了上面的以class T 作为参数类型以外,我们还可以用template <int N>来声明一个整数N作为模板参数

  • 不过模板参数只支持整数类型(包括enum),浮点类型、指针类型不能声明为模板参数,自定义类型也不可以

模板参数:多个模板参数

int Nclass T 可以一起使用,你只需要指定其中一部分参数即可,会自动根据参数类型(T msg)、默认值(int N = 1),推断尖括号里没有指定的那些参数

template <int N = 1, class T>  
void two(T msg)
{for (int i = 0; i < N; i++){std::cout << msg << std::endl;}
}int main()
{two("one");
}

模板的惰性:延迟编译

要证明模板的惰性,只要下面的例子

template <class T = void>  
T two()
{"aaa" = "aaa";
}int main()
{std::cout << "aa" << std::endl;
}

只要是编译器编译了two 函数,则一定会报错,但是实际编译的时候是可以编译的,这是因为模板没有被调用,如果模板被调用了,才会编译报错。

总结

  • 类型作为参数:template <class T>

  • 整形作为参数:template <int N>

  • 定义默认参数:template <int N = 0, class T = int>

  • 使用模板函数:myfunc<T, N>()

  • 模板函数可以自动推导类型,从而参与重载

  • 模板具有惰性,多次编译的特点

http://www.lryc.cn/news/359566.html

相关文章:

  • Lambda表达式与函数式接口
  • Java字符串String详解
  • 互联网政务应用安全管理规定:使用安全连接方式访问
  • 安全测试用例及解析(Word原件,直接套用检测)
  • github将默认分支main改为master
  • java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader
  • 读后感:《SQL数据分析实战》运营SQL实用手册
  • 建设人工智能平台,主流GPU卡选型分析
  • RTSPtoWebRTC、RTSPtoWeb ( 自HTML播放):页面中预览摄像机视频,无插件的播放方式,适合局域网使用,无需流媒体服务器
  • C语言| 三个整数从小到大排序
  • C语言基础编程题目解析:探索逻辑与算法的奥秘
  • jmeter基础入门练习题
  • 大数据技术原理(三):HDFS 最全面的 API 操作,你值得收藏
  • Flink系列二:DataStream API中的Source,Transformation,Sink详解(^_^)
  • 最好的电脑数据恢复软件是什么
  • 机器学习模型调试学习总结
  • 文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕
  • 【C++进阶】深入STL之string:掌握高效字符串处理的关键
  • 一、初识Qt 之 Hello world
  • nginx搭建简单负载均衡demo(springboot)
  • SpringBoot的第二大核心AOP系统梳理
  • react、vue动态form表单
  • halcon程序如何导出C#文件
  • RabbitMQ三、springboot整合rabbitmq(消息可靠性、高级特性)
  • 第八十九周周报
  • Centos升级Openssh版本至openssh-9.3p2
  • 茉莉香飘,奶茶丝滑——周末悠闲时光的绝佳伴侣
  • 揭秘:Java字符串对象的内存分布原理
  • Vue.js - 生命周期与工程化开发【0基础向 Vue 基础学习】
  • Element-UI 快速入门指南