最近看了看模板的元编程,感觉有点意思。

一些计算可以在编译过程就能够完成,榨干编译器的最后一点资源。

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++ 模板元编程简单小栗子的更多相关文章

  1. 简单的说一下:tarits技法就是一种模板元编程,起可以将本来处于运行期的事拉到编译期来做,增加了运行效率。 看以非模板元编程的例子,就是前面的那个例子:

    void adance(std::list<int>::iterator& iter, int d) { if(typeid(std::iterator_traits<std ...

  2. C++模板元编程(C++ template metaprogramming)

    实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...

  3. 现代c++与模板元编程

    最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...

  4. C++模板元编程----选择排序

    目录 目录 前言 代码详解 数据的结构 数据的操作 分割向量 合并向量 寻找最大值 排序 总结 前言 模板在C++一直是比较神秘的存在.STL和Boost中都有大量运用模板,但是对于普通的程序员来说, ...

  5. C++模板元编程----堆排序

    目录 目录 前言 实现的一些小细节 Debug 惰性求值 总结 Ref 前言 经过前两次经验的积累,终于来到了麻烦的堆排序.在一开始接触模板元编程的时候,我就期望有一天能够写出元编程堆排序的代码.原因 ...

  6. 现代c++模板元编程:遍历tuple

    tuple是c++11新增的数据结构,通过tuple我们可以方便地把各种不同类型的数据组合在一起.有了这样的数据结构我们就可以轻松模拟多值返回等技巧了. tuple和其他的容器不同,标准库没有提供适用 ...

  7. 读书笔记_Effective_C++_条款四十八:了解模板元编程

    作为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子: template <int N> st ...

  8. c++ 模板元编程的一点体会

    趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...

  9. effective c++ Item 48 了解模板元编程

    1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...

随机推荐

  1. 比较String 字符串的字节大小

    package com.ittx.edi.erp;import java.io.File;import java.io.FileWriter;import java.io.IOException;pu ...

  2. vue 弹窗禁止底层滚动

    原因:底层视图高度超出百分百,加入弹窗后再苹果浏览器隐藏上下栏的情况下遮罩层没有完全遮住底层. 处理:打开弹窗后禁止底层滚动调用stop事件,关闭则开启底层滚动调用move事件. let mo=fun ...

  3. Qt update刷新之源码分析(三)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上次视频给大家从源码层面剖析了Qt刷新事件(QEvent::UpdateRequest)的处理流程,这次视频主要从源码层面剖析对刷新事件的进一步处理, ...

  4. P2766 最长不下降子序列问题 题解(网络流)

    题目链接 最长不下降子序列问题 解题思路 分成三小问解决. 第一小问,求\(LIS\),因为\(n<=500\),直接\(O(N^2)\)暴力求解即可. 第二三小问,建立模型用网络流求解. 对于 ...

  5. 快速排序(QuickSort)Java版

    快速排序 快速排序是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 ...

  6. Spring Boot 轻量替代框架 Solon 1.3.20 发布

    Solon 是一个微型的Java开发框架.项目2018年启动,参考过大量前人作品:内核0.1m的身材,超高的跑分,以及良好的使用体验.支持:RPC.REST API.MVC.WebSocket.Soc ...

  7. Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...

  8. 封装一个处理 react 异常的最简 ErrorBoundary 组件 🎅

    前言 从 React 16 开始,引入了 Error Boundaries 概念,它可以捕获它的子组件中产生的错误,记录错误日志,并展示降级内容,具体 官网地址. 错误边界避免一个组件错误导致整个页面 ...

  9. 北航OO第一单元作业总结(1.1~1.3)

    经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...

  10. 2020-BUAA-OO-面向对象设计与构造-第四单元总结&课程总结

    咱的OO结束辣! Part1: Unit4 Summary 本单元作业,我主要使用了适配器模式和访问者模式.总体上看,代码量和文件数量有所上升,但配合分包等措施后,文件结构清晰,各部分耦合度均较低.缺 ...