这个还是基于之前实现的那个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++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成的更多相关文章

  1. C++模板元编程----选择排序

    目录 目录 前言 代码详解 数据的结构 数据的操作 分割向量 合并向量 寻找最大值 排序 总结 前言 模板在C++一直是比较神秘的存在.STL和Boost中都有大量运用模板,但是对于普通的程序员来说, ...

  2. C++模板元编程(C++ template metaprogramming)

    实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...

  3. C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法

    C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供. 开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别 ...

  4. 现代c++与模板元编程

    最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...

  5. C++ 模板元编程 学习笔记

    https://blog.csdn.net/K346K346/article/details/82748163 https://www.jianshu.com/p/b56d59f77d53 https ...

  6. 现代c++模板元编程:遍历tuple

    tuple是c++11新增的数据结构,通过tuple我们可以方便地把各种不同类型的数据组合在一起.有了这样的数据结构我们就可以轻松模拟多值返回等技巧了. tuple和其他的容器不同,标准库没有提供适用 ...

  7. C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE

    本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...

  8. effective c++ Item 48 了解模板元编程

    1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...

  9. 读书笔记 effective c++ Item 48 了解模板元编程

    1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...

随机推荐

  1. Linux共享对象之编译参数fPIC

    最近在看Linux编程的基础知识,打算对一些比较有趣的知识做一些汇总备忘,本文围绕fPIC展开,学习参考见文末. 在Linux系统中,动态链接文件称为动态共享对象(DSO,Dynamic Shared ...

  2. WCF事务应用[转]

    在B2B的项目中,一般用户注册后,就有一个属于自己的店铺,此时,我们就要插入两张表, User和Shop表. 当然,要么插入成功,要么全失败. 第一步: 首先看一下项目的结构图: 第二步: 准备工作, ...

  3. EXCEPT差集运算

    EXCEPT差集运算在逻辑上先删除两个输入多集中的重复行,把多集变成集合,然后返回只在第一个集合中出现,在第二个集合中不出现的所有行.可以看下面示意图.

  4. iOS开发UI篇—常见的项目文件介绍

    iOS开发UI篇—常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...

  5. ets查询:查询表中的具体一列的所有值

    比如要查询goods表中的ID这一列的所有值: P = [{#goods{upgrade='$1',_ = '_'},[],['$1']}] 要查询ID和Upgrade这两列的值: P2 = [{#g ...

  6. RoseRT 建模学习

    目录: 一.RoseRT理论知识 二.一个完整模型的建立 三.TD-SCDMA(UE侧)RRC层建模的学习 四.LTE的RRC层建模(1.自主完成‘2.也可以是L2) 五.参考文献 一.RoseRT理 ...

  7. Linux下使用yum安装MariaDB

    版本:centos7 Linux下安装MariaDB官方文档参见:https://mariadb.com/kb/zh-cn/installing-mariadb-with-yum/ 1.创建Maria ...

  8. ios 各种技术

    1.NSlog  发布后不打印 #ifdef DEBUG// 如果有DEBUG这个宏就编译下面一句代码 #define DDLog(...) NSLog(__VA_ARGS__) #else // 如 ...

  9. js中Dom对象的position属性

    首先应该明白什么是流?这个估计也很容易明白,我就不说了.顺便说下,float设置了这个属性就暂时脱离了流的存在,clear后才会到流里面. position:absolute| fixed | rel ...

  10. Scalding初探之番外篇:Mac OS下的安装

    把你从写繁琐的Map-reduce Job中解放出来,写分布式跟写本地程序没两样,Scalding真真代表着先进生产力的方向啊 心动不如行动,赶紧装一个吧 1 安装JDK 2 安装Homebrew r ...