C++ 模板元编程简单小栗子
最近看了看模板的元编程,感觉有点意思。
一些计算可以在编译过程就能够完成,榨干编译器的最后一点资源。
stl中用的全是这些玩意。
当然,这增加了编译时长。
我记得貌似有“图灵完备”这个说法——模板的元编程现在能够实现判断跳转、循环,理论上来说,一般能够用运行时解决的问题,在编译时都能够解决。
但这个好像没有什么意义。如果通篇都用这种代码来编写程序,那么这和直接嵌入汇编有什么区别?
我学这个纯属是为了让别人看不懂。
(我真的猜不透你耶……)
疯子就应该有疯子应该有的疯度。
写了几个小例子用来备忘。
学习参考链接: https://www.cnblogs.com/qicosmos/p/4480460.html
1.判断类型是否相同(C++自带也有 std::is_same<T1, T2>::value)
1 template <typename T1, typename T2>
2 struct is_same_type
3 {
4 enum { value = false };
5 };
6
7 template <typename T>
8 struct is_same_type<T, T>
9 {
10 enum { value = true };
11 };
2.计算阶乘
1 //n!
2 template<int n>
3 struct factorial
4 {
5 private:
6 enum: unsigned long long {
7 tmp = n * factorial<n - 1>::value //It is useless.
8 };
9
10 public:
11 enum {
12 value = tmp >= INT_MAX ? -1 : tmp //return n * factorial(n - 1);
13 };
14 };
15
16 template<>
17 struct factorial<0> //if(0 == n)
18 {
19 enum { value = 1 }; //return 1
20 };
3.获取一组数中最大的数
1 //get max number.
2 template<int n, int... ns>
3 struct max_num
4 {
5 enum {value = n}; //return n;
6 };
7
8 template <int ln/*left number*/, int rn/*right number*/, int... ns/*numbers...*/>
9 struct max_num<ln, rn, ns...>
10 {
11 enum {value =
12 ln >= rn ? //if(ln >= rn)
13 max_num<ln, ns...>::value : //max_num(ln)
14 max_num<rn, ns...>::value // else max_num(rn)
15 };
16 };
4.根据模板中不同的类型来获得不同的值(比如SocketTCP 和 SocketTCP 使用不同的协议类型和数据传输类型)
1 enum PROTO_TYPE
2 {
3 PROTO_NONE = 0,
4 PROTO1 = 1,
5 PROTO2 = 2
6 };
7
8 class A
9 {
10 };
11
12 class B
13 {
14 };
15
16 template <class T>
17 struct getproto
18 {
19 enum {
20 value = //value =
21 std::is_same<T, A>::value ? PROTO1 : //if(typeT == typeA) return PROTO1;
22 std::is_same<T, B>::value ? PROTO2 : //else if(typeT == typeB) return PROTO2;
23 //TODO: others...
24 PROTO_NONE //else return PROTO_NONE;
25 };
26 };
0.主函数用来测试
1 int main()
2 {
3 std::cout << "is_same_type: " <<is_same_type<int, int>::value << std::endl;
4 std::cout << "factorial:" << factorial<10>::value << std::endl;
5 std::cout << "max_num:"<< max_num<1, 2, 54, 2, 36, 4>::value << std::endl;
6
7 std::cout << "getproto: " << getproto<B>::value << std::endl;
8
9 system("pause>nul");
10 return 0;
11 }
C++ 模板元编程简单小栗子的更多相关文章
- 简单的说一下:tarits技法就是一种模板元编程,起可以将本来处于运行期的事拉到编译期来做,增加了运行效率。 看以非模板元编程的例子,就是前面的那个例子:
void adance(std::list<int>::iterator& iter, int d) { if(typeid(std::iterator_traits<std ...
- C++模板元编程(C++ template metaprogramming)
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...
- 现代c++与模板元编程
最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...
- C++模板元编程----选择排序
目录 目录 前言 代码详解 数据的结构 数据的操作 分割向量 合并向量 寻找最大值 排序 总结 前言 模板在C++一直是比较神秘的存在.STL和Boost中都有大量运用模板,但是对于普通的程序员来说, ...
- C++模板元编程----堆排序
目录 目录 前言 实现的一些小细节 Debug 惰性求值 总结 Ref 前言 经过前两次经验的积累,终于来到了麻烦的堆排序.在一开始接触模板元编程的时候,我就期望有一天能够写出元编程堆排序的代码.原因 ...
- 现代c++模板元编程:遍历tuple
tuple是c++11新增的数据结构,通过tuple我们可以方便地把各种不同类型的数据组合在一起.有了这样的数据结构我们就可以轻松模拟多值返回等技巧了. tuple和其他的容器不同,标准库没有提供适用 ...
- 读书笔记_Effective_C++_条款四十八:了解模板元编程
作为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子: template <int N> st ...
- c++ 模板元编程的一点体会
趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...
- effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
随机推荐
- .Net Core 2.1 升级3.1 问题整理
随着技术的不断拓展更新,我们所使用的技术也在不断地升级优化,项目的框架也在不断地升级,本次讲解 .net core 2.1 升级到3.1所需要注意的事项: 当项目框架升级后,所有的Nuget引用也会 ...
- 「CTSC 2013」组合子逻辑
Tag 堆,贪心 Description 给出一个数列 \(n\) 个数,一开始有一个括号包含 \([1,n]\),你需要加一些括号,使得每个括号(包括一开始的)所包含的元素个数 \(\leq\) 这 ...
- 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念
深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 一.AQS框架简介 AQS诞生于Jdk1.5,在当时低效且功能单一的synchroni ...
- python 集合详解
字符串 一个个字符组成的有序的序列,时字符的集合 使用单引,双引,三引 引住的字符序列 字符时不可变的对象 bytes定义 bytes不可变字节序列 使用b前缀定义 只允许基本ASCII使用字符形式 ...
- gtk+2.0中函数set_widget_font_size()函数在编译时未定义的解决办法
自己写一个头文件即可,代码如下: 在.c文件中包含该头文件即可
- 翻译:《实用的Python编程》06_03_Producers_consumers
目录 | 上一节 (6.2 自定义迭代) | 下一节 (6.4 生成器表达式) 6.3 生产者,消费者和管道 生成器在设置各种生产者/消费者问题(producer/consumer problems) ...
- epoll poll select区别
函数依赖 ( Functional Dependency,FD) select:http://www.cnblogs.com/Anker/archive/2013/08/14/3258674.html ...
- kubernetes中有状态应用的优雅缩容
将有状态的应用程序部署到Kubernetes是棘手的. StatefulSet使它变得容易得多,但是它们仍然不能解决所有问题.最大的挑战之一是如何缩小StatefulSet而不将数据留在断开连接的Pe ...
- java面试-JDK自带的JVM 监控和性能分析工具用过哪些?
一.JDK的命令行工具 1.jps(JVM Process Status Tools):虚拟机进程状况工具 jps -l 2.jinfo(Configuration Info for java):Ja ...
- 201871030115-康旭 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18卓越班 这个作业要求链接 实验三结对编程要求 我的课程学习目标 (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming):(2)掌握Git ...