C++模板元编程 - 1 基本数据类型和运算
这是博客开通前几天做的,C++的模板没办法存方便的浮点数,算了。
基本类型的设计参考了vczh轮子叔模仿boost的MPL的设计。
话说template和typename写多了真是无限烦人啊,不得已定义了几个宏,然后运算的定义也是用宏批量生成的。
template<typename TPOD, TPOD V>
struct PODType
{
static const TPOD Value = V;
using Type = TPOD;
using Self = PODType<TPOD, V>;
}; template<int VInt>
using Int = PODType<int, VInt>; template<bool VBool>
using Bool = PODType<bool, VBool>; template<char VChar>
using Char = PODType<char, VChar>; #define TN typename
#define TT template
#define SS struct #define DEFINE_BIN_META_OPERATION_HEAD(Name) \
TT<TN T1, TN T2> \
SS Name #define DEFINE_BIN_META_OPERATION_BODY(Name, TType, VType, RType, op) \
TT<VType V1, VType V2> \
SS Name<TType<V1>, TType<V2>> \
{ \
using Result = TN RType<(V1 op V2)>; \
} #define DEFINE_UNA_META_OPERATION_HEAD(Name) \
TT<TN T1> \
SS Name #define DEFINE_UNA_META_OPERATION_BODY(Name, TType, VType, RType, op) \
TT<VType V1> \
SS Name<TType<V1>> \
{ \
using Result = TN RType<(op V1)>; \
} DEFINE_BIN_META_OPERATION_HEAD(Add);
DEFINE_BIN_META_OPERATION_BODY(Add, Int, int, Int, +);
DEFINE_BIN_META_OPERATION_BODY(Add, Char, char, Char, +);
DEFINE_BIN_META_OPERATION_HEAD(Sub);
DEFINE_BIN_META_OPERATION_BODY(Sub, Int, int, Int, -);
DEFINE_BIN_META_OPERATION_BODY(Sub, Char, char, Char, -);
DEFINE_BIN_META_OPERATION_HEAD(Mul);
DEFINE_BIN_META_OPERATION_BODY(Mul, Int, int, Int, *);
DEFINE_BIN_META_OPERATION_BODY(Mul, Char, char, Char, *);
DEFINE_BIN_META_OPERATION_HEAD(Div);
DEFINE_BIN_META_OPERATION_BODY(Div, Int, int, Int, / );
DEFINE_BIN_META_OPERATION_BODY(Div, Char, char, Char, / );
DEFINE_BIN_META_OPERATION_HEAD(Mod);
DEFINE_BIN_META_OPERATION_BODY(Mod, Int, int, Int, %);
DEFINE_BIN_META_OPERATION_BODY(Mod, Char, char, Char, %);
DEFINE_BIN_META_OPERATION_HEAD(And);
DEFINE_BIN_META_OPERATION_BODY(And, Bool, bool, Bool, &&);
DEFINE_BIN_META_OPERATION_HEAD(Or);
DEFINE_BIN_META_OPERATION_BODY(Or, Bool, bool, Bool, || );
DEFINE_BIN_META_OPERATION_HEAD(Xor);
DEFINE_BIN_META_OPERATION_BODY(Xor, Bool, bool, Bool, ^);
DEFINE_BIN_META_OPERATION_HEAD(Eq);
DEFINE_BIN_META_OPERATION_BODY(Eq, Bool, bool, Bool, == );
DEFINE_BIN_META_OPERATION_BODY(Eq, Int, int, Bool, == );
DEFINE_BIN_META_OPERATION_BODY(Eq, Char, char, Bool, == );
DEFINE_BIN_META_OPERATION_HEAD(Neq);
DEFINE_BIN_META_OPERATION_BODY(Neq, Bool, bool, Bool, != );
DEFINE_BIN_META_OPERATION_BODY(Neq, Int, int, Bool, != );
DEFINE_BIN_META_OPERATION_BODY(Neq, Char, char, Bool, != );
DEFINE_BIN_META_OPERATION_HEAD(Gt);
DEFINE_BIN_META_OPERATION_BODY(Gt, Int, int, Bool, > );
DEFINE_BIN_META_OPERATION_BODY(Gt, Char, char, Bool, > );
DEFINE_BIN_META_OPERATION_HEAD(Lt);
DEFINE_BIN_META_OPERATION_BODY(Lt, Int, int, Bool, < );
DEFINE_BIN_META_OPERATION_BODY(Lt, Char, char, Bool, < );
DEFINE_BIN_META_OPERATION_HEAD(Ge);
DEFINE_BIN_META_OPERATION_BODY(Ge, Int, int, Bool, >= );
DEFINE_BIN_META_OPERATION_BODY(Ge, Char, char, Bool, >= );
DEFINE_BIN_META_OPERATION_HEAD(Le);
DEFINE_BIN_META_OPERATION_BODY(Le, Int, int, Bool, <= );
DEFINE_BIN_META_OPERATION_BODY(Le, Char, char, Bool, <= );
DEFINE_UNA_META_OPERATION_HEAD(Neg);
DEFINE_UNA_META_OPERATION_BODY(Neg, Int, int, Int, -);
DEFINE_UNA_META_OPERATION_BODY(Neg, Char, char, Char, -);
DEFINE_UNA_META_OPERATION_HEAD(Not);
DEFINE_UNA_META_OPERATION_BODY(Not, Bool, bool, Bool, !);
使用起来是这样的
Int<> a;
Int<> b;
Add<decltype(a), decltype(b)>::Result aplusb;
Sub<decltype(a), decltype(b)>::Result aminusb; Bool<false> b1;
Bool<true> b2;
And<decltype(b1), decltype(b2)>::Result b1andb2;
可以从vs2015的intellisense很清楚得看到运算结果
就这样
C++模板元编程 - 1 基本数据类型和运算的更多相关文章
- C++ 模板元编程 学习笔记
https://blog.csdn.net/K346K346/article/details/82748163 https://www.jianshu.com/p/b56d59f77d53 https ...
- C++模板元编程(C++ template metaprogramming)
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...
- C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成
这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数.所有浮点数.字符串,分别将这三种“大类”的数据分配到对应的Converter上. 为此实现了一些方便的 ...
- C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法
C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供. 开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别 ...
- 读书笔记_Effective_C++_条款四十八:了解模板元编程
作为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子: template <int N> st ...
- c++ 模板元编程的一点体会
趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...
- C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE
本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...
- C++模板元编程 - 2 模仿haskell的列表以及相关操作
这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D> ...
- 一道模板元编程题源码解答(replace_type)
今天有一同学在群上聊到一个比较好玩的题目(本人看书不多,后面才知是<C++模板元编程>第二章里面的一道习题), 我也抱着试一试的态度去完成它, 这道题也体现了c++模板元编程的基础和精髓: ...
随机推荐
- ExtJS参考手册
ExtJS是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.因此,可以把ExtJS用在.Net.Java.Php等各种开发语言开发的应用中.ExtJs ...
- display:none,overflow:hidden,visibility:hidden之间的区别
一,display:none; 隐藏元素,不占网页中的任何空间,让这个元素彻底消失(看不见也摸不着) 二,overflow:hidden; 让超出的元素隐藏,就是在设置该属性的时候他会根据你设置的宽高 ...
- C#实现图片文件到数据流再到图片文件的转换 --转
/----引入必要的命名空间 using System.IO; using System.Drawing.Imaging; //----代码部分----// private byte[] photo; ...
- struts2获得request和session对象
在struts1中,获得到系统的request或者session对象非常方便,都是按照形参传递的,但是在struts2中,request和session都被隐藏了 struts2提供两种方式访问ses ...
- JSON 序列化和反序列化——JavaScriptSerializer实现
一. JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.您无法访问序列化程序的此实例.但是,此类公开了公共 API.因此, ...
- asp.net脚本获取不到id,服务器控件id生成html页面id控制
在配置文件里修改id的生成方式.经过搜索发现是因为使用Sharpmap而在Web.config中加入的一句配置造成的影响. <pages controlRenderingCompatibilit ...
- iframe中子页面通过js计算高度(使得页面不会显示不全)
使用过iframe的人,都知道,它是一个模版,里面有一个iframe,而iframe当中,是可以嵌套多个页面的.(比较常见的问题,就是iframe页面中,经常会出现内容显示不全的时候). 谨记,通过j ...
- Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封 ...
- 使用JavaScript实现一个倒数计时程序
使用JavaScript在网页中实现一个计算当年还剩多少时间的倒数计时程序,网页上能够实时动态显示“XX年还剩XX天XX时XX分XX秒”: 程序代码如下: <meta charset=" ...
- shell之数组
1.从数组的下标分为索引数组.关联数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* 索引数组,即通常情况下所说的数组 */ var ary1 = [1,3,5, ...