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++实现的并且可以在 ...
随机推荐
- 提升Idea启动速度与Tomcat日志乱码问题
提升Idea启动速度与Tomcat日志乱码问题 前言 由于重装了一次Idea,所以有些设置时间就忘了,在此做个记录,以便以后忘记后可以来翻阅 Idea启动速度 一.将Idea所在的 安装文件夹 在wi ...
- 热门跨平台方案对比:WEEX、React Native、Flutter和PWA
本文主要对WEEX.React Native.Flutter和PWA几大热门跨平台方案进行简单的介绍和对比.内容选自<WEEX跨平台开发实战> (WEEX项目负责人力荐,从入门到实战,教你 ...
- 多线程之volative关键字
目录 轻量级同步机制:volative关键字 volative的作用 volatile非原子特性 volatile与synchronized比较 常用原子类进行自增自减操作 CAS 使用CAS原理实现 ...
- 颠覆你认知的Python3.9
我通读了python 3.9发行说明和相关的讨论.根据这些信息,我想写一个全面的指南,以便每个人都能一眼了解这些功能及其详细的工作原理 原文地址,点击这里,观看效果更佳 简而言之 从字典更新/合并到添 ...
- Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo
前言 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...
- Java类集框架详细汇总-底层分析
前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...
- Codeforces-121C(逆康托展开)
题目大意: 给你两个数n,k求n的全排列的第k小,有多少满足如下条件的数: 首先定义一个幸运数字:只由4和7构成 对于排列p[i]满足i和p[i]都是幸运数字 思路: 对于n,k<=1e9 一眼 ...
- 【2020.02.01NOIP普及模拟4】怪兽
[2020.02.01NOIP普及模拟4]怪兽 文章目录 [2020.02.01NOIP普及模拟4]怪兽 题目描述 输入 输出 输入输出样例 数据范围限制 提示 解析 code 题目描述 PYWBKT ...
- 结对编程_stage2
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目-第二阶段 我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法.敏捷开发方法. ...
- Unity2D项目-平台、解谜、战斗! 0.2 序言:团队在线协作方案、基线控制
各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文跟大家聊一下笔者团队中所使用的在线协作的诸多工具,以及使用这些工具的目的和所记录的内容,希望这些内容在大家团队工作中有所帮 ...