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

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

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. GreenDao3.2使用详解(增,删,改,查,升级)

    首先看一下效果图: 项目结构如下图所示: 第一步:在build中添加配置如下: projet 目录下的build.gradle dependencies { classpath 'org.greenr ...

  2. 使用jQuery实现ajax请求

    <%-- Created by IntelliJ IDEA. User: Administrator Date: 2021/3/13 Time: 14:54 To change this tem ...

  3. ECMAScript 2017(ES8)新特性简介

    目录 简介 Async函数 共享内存和原子操作 Object的新方法 String的新方法 逗号可以添加到函数的参数列表后面了 简介 ES8是ECMA协会在2017年6月发行的一个版本,因为是ECMA ...

  4. windows与远程linux服务器进行文件传输

    在学习pwn时找到了http://pwnable.kr这个网站,很多题目通过ssh连接, ssh otp@pwnable.kr -p2222 (pw:guest) 连接脚本: pwn_ssh=ssh( ...

  5. 微服务面试必问的Dubbo,这么详细还怕自己找不到工作?

    大家好,我是小羽. Dubbo 起源于阿里巴巴,对于我们做电商开发的人来说,基本是首选的技术,那么为何一个区区 soa 服务治理框架,会受到这么多人的青睐呢? 今天就跟着小羽一起看看这个微服务框架之一 ...

  6. 为了效率,我们可以用的招数 之 strlen

    如果要你写一个计算字符串长度的函数 strlen,应该怎么写?相信你很容易写出如下实现: 1 int strlen_1(const char* str) { 2 int cnt = 0; 3 4 if ...

  7. [Azure Devops] 使用 Azure Pipelines 实现 CI

    1. 什么是 Azure Pipelines Azure Pipelines 会自动构建和测试代码项目,以将其提供给其他人.它适用于任何语言或项目类型.Azure Pipelines 结合了持续集成 ...

  8. 3,turicreate入门 - 优化回归模型,使得预测更准确

    turicreate入门系列文章目录 1,turicreate入门 - jupyter & turicreate安装 2,turicreate入门 - 一个简单的回归模型 3,turicrea ...

  9. [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.3 阻抗和传递函数图形的构建

    8.3 阻抗和传递函数图形的构建 通常,我们可以通过观察来绘制近似的bode图,这样没有大量混乱的代数和不可避免的有关代数错误.使用这种方法可以对电路运行有较好的了解.在各种频率下哪些元件主导电路的响 ...

  10. Recoil 中多级数据联动及数据重置的合理做法

    前情回顾 书接上回,前面引出了在数据存在级联的情况下,各下拉框之间的默认值及值变化的处理.简单回顾一下: 场景是: 地域下拉决定可选的可用区 默认选中第一个地域,通过设置 atom 的 default ...