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

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

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. SQL 性能起飞了!

    直接上干货 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及order by涉及的列上建立索引. 应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值 ...

  2. MyBatis(四):自定义持久层框架优化

    本文所有代码已上传至码云:https://gitee.com/rangers-sun/mybatis 修改IUserDao.UserMapper.xml package com.rangers; im ...

  3. AmazonS3 使用AWS SDK for Java实现跨源资源共享 (CORS)

    CORS 配置 创建 CORS 配置并对存储桶设置该配置 通过添加规则来检索并修改配置 向存储桶添加修改过的配置 删除配置 import com.amazonaws.AmazonServiceExce ...

  4. golang float32/64转string

    v := 3.1415926535 s1 := strconv.FormatFloat(v, 'E', -1, 32)//float32s2 := strconv.FormatFloat(v, 'E' ...

  5. Nodejs学习笔记(2) 阻塞/非阻塞实例 与 Nodejs事件

    1. Node.js异步编程的特点 2. 阻塞与非阻塞的实例 2.1 阻塞代码实例 2.2 非阻塞代码实例 3. Node.js的事件驱动 4. 事件循环实例 1. Node.js异步编程的特点 参考 ...

  6. requirejs的用法

    requirejs的用法 2014年11月6日 17164次浏览 之前我的一片文章介绍过requirejs,具体地址是:http://www.haorooms.com/post/RequireJS_m ...

  7. BeautifulSoup爬取微博热搜榜

    获取url 设定请求头 requests发出get请求 实例化BeautifulSoup对象 BeautifulSoup提取数据 import requests 2 from bs4 import B ...

  8. SpringCloud 中 Feign 调用使用总结

    最近做微服务架构的项目,在用 feign 来进行服务间的调用.在互调的过程中,难免出现问题,根据错误总结了一下,主要是请求方式的错误和接参数的错误造成的.在此进行一下总结记录. 以下通过分为三种情况说 ...

  9. ch2_8_4求解投骰子游戏问题

    思路:递推.到第n步可以从第0步走n步到第n步,从第1步走n-1步到第n步... ...依次类推,=> f(n)=f(0)+f(1)+...+f(n-1) import java.util.Sc ...

  10. 攻防世界 reverse 进阶 15-Reversing-x64Elf-100

    15.Reversing-x64Elf-100 这题非常简单, 1 signed __int64 __fastcall sub_4006FD(__int64 a1) 2 { 3 signed int ...