C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成
这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数、所有浮点数、字符串,分别将这三种“大类”的数据分配到对应的Converter上。
为此实现了一些方便的类型运算工厂,比如TypeEqFact,同于生成比较两个类型是否相等的谓词,PredOrFact,用于生成将若干个谓词采用“或”运算生成的新谓词。
template<class T>
struct TypeEqFact
{
template<class TTest>
using Get = typename TypeEq<T, TTest>;
};
和
template<template<class T> class... TPreds>
struct PredOrFact
{
template<class TStatement>
using Get = typename TypeNeq<
typename MultiState<TStatement, TPreds...>::Result,
FalseType
>;
};
这里就形成了我自己模板元编程里的另一个约定,工厂模板使用Get成员获取产生的模板谓词
使用起来就是这样的
TypeEqFact<char*>::Get
这个东西就是一个谓词了,就是一个模板类,就像没有加尖括号的vector那样,不能直接定义类型,如果给它一个实例类,像 TypeEqFact<char*>::Get<int>::Result x; ,这里面x的类型就是FalseType; TypeEqFact<char*>::Get<char*>::Result y; ,这里面y就是TrueType。
至于PredOrFact,这样用:
PredOrFact<IsInteger, IsFloat>::Get
这个东西也是一个谓词,正常使用就好,比如
PredOrFact<IsInteger, IsFloat>::Get<int>::Result x1;
PredOrFact<IsInteger, IsFloat>::Get<long>::Result x2;
PredOrFact<IsInteger, IsFloat>::Get<float>::Resukt x3;
PredOrFact<IsInteger, IsFloat>::Get<long double>::Result x4;
这里面x1~x4都是TrueType,因为他们满足这里面两个谓词中的其中一个,而对于其他的既不是正数又不是浮点数的类型,他们的结果都是FalseType。
合并起来,在我的类型重载决议代码里:
MultiState<TNumber, IsInteger, IsFloat, PredOrFact<TypeEqFact<char*>::Get, TypeEqFact<const char*>::Get>::Get>::Result();
太乱了?这么看
MultiState<
TNumber,
IsInteger,
IsFloat,
PredOrFact<
TypeEqFact<char*>::Get,
TypeEqFact<const char*>::Get
>::Get
>::Result();
MultiState接受一个TNumber,把它依序和三个谓词进行比较,前两个是自带的谓词,第三个是用PredOrFact工厂生成的,被合成的两个谓词,分别是用TypeEqFact工厂生成的。
这样最后的结果,所有的整数使用一个函数,所有的浮点数使用一个函数,所有的字符串(char*,const char*)使用一个函数,只要写三个,还不需要模板特例化什么的。
函数的类型参数里只要分别给每一个类型大类写一个仅用于重在决议的类型参数就好,像这样:
template<typename T>
static std::vector<bool> ToVectorBool(T intNumber, State<>);
template<typename T>
static std::vector<bool> ToVectorBool(T floatNumber, State<>);
template<typename T>
static std::vector<bool> ToVectorBool(T cstrNumber, State<>);
State<0>~State<2>分别对应上面那行代码生成的类型。
爽。
C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成的更多相关文章
- C++模板元编程----选择排序
目录 目录 前言 代码详解 数据的结构 数据的操作 分割向量 合并向量 寻找最大值 排序 总结 前言 模板在C++一直是比较神秘的存在.STL和Boost中都有大量运用模板,但是对于普通的程序员来说, ...
- C++模板元编程(C++ template metaprogramming)
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...
- C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法
C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供. 开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别 ...
- 现代c++与模板元编程
最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...
- C++ 模板元编程 学习笔记
https://blog.csdn.net/K346K346/article/details/82748163 https://www.jianshu.com/p/b56d59f77d53 https ...
- 现代c++模板元编程:遍历tuple
tuple是c++11新增的数据结构,通过tuple我们可以方便地把各种不同类型的数据组合在一起.有了这样的数据结构我们就可以轻松模拟多值返回等技巧了. tuple和其他的容器不同,标准库没有提供适用 ...
- C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE
本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...
- effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
- 读书笔记 effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
随机推荐
- oracle with as
http://blog.csdn.net/a9529lty/article/details/4923957/
- SQL Server 2008中查看锁信息
;with tran_locks as(select resource_type,db_name(resource_database_id) as db_name,resource_descripti ...
- NetworkReachable学习笔记
一.基本知识 在需要联网的iPhone程序中,我们首先需要检查网络的状态,如果不能连接网络则告诉用户程序不能使用的原因是没有网络连接.在iPhone的SystemConfiguration框架里有提供 ...
- linux命令每日一练习-rmdir mv
rmdir 删除一个空的文件夹,当目标文件夹非空的时候不能删除 mv 移动文件或目录 mv source target mv -i *** *** 如果目标文件存在则询问是否覆盖 mv -f *** ...
- linux下用命令导出mysql表数据
由于数据库服务器是内网环境,只能通过linux跳板机连接,所以navicat工具暂时用不上. 1.用Xshell工具连接跳板机 2.再通过跳板机连接数据库服务器 >ssh -p port ip ...
- juery常用
1input解除焦点时触发操作 同时给另一个元素赋值 $(document).ready(function(){ $("input[name='url']").change(fun ...
- web前端基础篇①
html1.html5和css3在IE上都不支持2.超过1100px以上的宽度,就会出现滚动条3.<!doctype html>解析模式 分为 标准模式 混杂模式 非标准模式-针对IE6o ...
- Python开发入门与实战8-基于Java的集成开发环境
8. 基于Java的Python的集成开发环境 目前为止我们所有的代码和例子都是通过Notepad文本编辑器来实现的,实际项目开发中这种编码模式效率较低(大虾除外),使用IDE集成开发环境常常大幅度的 ...
- css3 弹框功能样式
.message-box{ position: fixed; top: 0; right: 0; bottom: 0; left: 0; background-color: rgba(0, 0, 0, ...
- wireshark使用方法(学习笔记一)
wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了. 为了安全考虑 ...