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++模板元编程的基础和精髓: ...
随机推荐
- hdu1003 dp(最大子段和)
题意:给出一列数,求其中的最大子段和以及该子段的开头和结尾位置. 因为刚学过DP没几天,所以还会这题,我开了一个 dp[100002][2],其中 dp[i][0] 记录以 i 为结尾的最大子段的和, ...
- Meven笔记
技术交流群:233513714 1.Meven环境搭建 http://www.cnblogs.com/quanyongan/archive/2013/04/17/3025971.html 2.Ecli ...
- 系统镜像以及微PE工具箱
微PE地址:http://www.wepe.com.cn/download.html MSDN镜像下载地址:http://msdn.itellyou.cn/ 小白也能轻松装系统(win10 64位) ...
- Optimize Managed Code For Multi-Core Machines
Parallel Performance Optimize Managed Code For Multi-Core Machines Daan Leijen and Judd Hall This ar ...
- HTTPS-SSL/TSL与SNI的关系以及同IP多域名虚拟主机的SSL/TSL认证
早期的SSLv2根据经典的公钥基础设施PKI(Public Key Infrastructure)设计,它默认认为:一台服务器(或者说一个IP)只会提供一个服务,所以在SSL握手时,服务器端可以确信客 ...
- HBase 安装过程记录
http://blog.csdn.net/chenxingzhen001/article/details/7756129 环境: 操作系统Centos 6.4 32-bit 三台节点 ip ...
- lvM增减教程-转
http://blog.jobbole.com/71858/ 逻辑卷管理LVM是一个多才多艺的硬盘系统工具.无论在Linux或者其他类似的系统,都是非常的好用.传统分区使用固定大小分区,重新调整大小十 ...
- 给 input 中 type="text" 设置CSS样式
input[type="text"], input[type="password"] { border: 1px solid #ccc; paddi ...
- JS对日期时间的操作
代码: //判断是否超期(有效期开始超过一年后算已超期) function IsEffect(effectDate) { var val = ""; var currentDate ...
- gcc、g++
http://hi.baidu.com/zhangcunli8499/item/257e187360b48b2bd6a89cc6 g++ src/*.cpp -I include/ -I includ ...