boost学习 泛型编程之traits 学习
traits使用的场景一般有三种 分发到不同处理流程 解决C++代码中某些无法编译的问题
比如一个图书馆的代码,接受书籍并收入到不同类别中
template<class T> // T表示接受的是何种书籍
void AcceptBooks(T books)
{
... //do something
};
我们有不同书籍 历史类书籍和计算机类书籍
struct history_tag{}; //这只是个空类,目的是激发函数重载
struct computer_tag{}; //同上
class HistoryBooks
{
public:
// 类型(身份)标志,表示这是历史类书籍,
// 如果是历史类则为typedef history_tag bookType;
typedef history_tag bookType;
};
class ComputerBooks
{
public:
typedef computer_tag bookType;
};
然后在接受书籍的代码里,对于不同类型的书籍进行不同处理
// 第二个参数为无名参数,只是为了激发函数重载
template<typename T>
void Accept(T& t,computer_tag)
{
std::cout << "accept computer books" << std::endl;
}
template<typename T>
void Accept(T& t,history_tag)
{
std::cout << "accept history books" << std::endl;
}
于是先前的AcceptBooks函数可以改写如下:
template<typename T>
void AcceptBooks(T& t)
{
// 无论是accept 历史书籍还是计算机书籍,根据不同的type 进入到不同的accept函数中去了
typedef typename T::bookType bookType;
Accept(t,bookType());
}
当然 进行一些必要的封装 看起来就更像样子了
template<typename T>
struct BooksTraits
{
typedef typename T::bookType bookType;
};
accept函数就写成这样
Accept(t, typename BooksTraits<T>::bookType());
完整代码如下:
#include <iostream>
struct history_tag{}; //这只是个空类,目的是激发函数重载
struct computer_tag{}; //同上
class HistoryBooks
{
public:
typedef history_tag bookType;
};
class ComputerBooks
{
public:
typedef computer_tag bookType;
};
template<typename T>
void Accept(T& t,computer_tag)
{
std::cout << "accept computer books" << std::endl;
}
template<typename T>
void Accept(T& t,history_tag)
{
std::cout << "accept history books" << std::endl;
}
// template<typename T>
// void AcceptBooks(T& t)
// {
// typedef typename T::bookType bookType;
// Accept(t,bookType());
// }
template<typename T>
struct BooksTraits
{
typedef typename T::bookType bookType;
};
template<typename T>
void AcceptBooks(T& t)
{
Accept(t, typename BooksTraits<T>::bookType());
}
int _tmain(int argc, _TCHAR* argv[])
{
ComputerBooks cb;
HistoryBooks hb;
AcceptBooks(cb);
AcceptBooks(hb);
return 0;
}
一些示例代码
// 123.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <type_traits>
#include <iostream> //=======================================================
// is array
template<typename T>
struct is_array {
static const bool value = false;
}; template<typename T,size_t N>
struct is_array < T[N] > {
static const bool value = true;
};
//========================================================= //===========================================================
//is class
typedef char(&yes_type)[]; // sizeof(yes_type)==1
typedef char(&no_type)[]; // sizeof(no_type)==2 template<typename T>
struct is_class_impl {
template<typename U>
static
yes_type is_class_tester(void(U::*)(void)); template<typename U>
static
no_type is_class_tester(...);
static const bool value = (sizeof(is_class_tester<T>()) == sizeof(yes_type));
}; template<typename T>
struct is_class
{
// 所有实现都在is_class_imp中
static const bool value = is_class_impl<T>::value;
}; class testA {};
//============================================================== //============================================================
//is member function pointer //================================================= int main()
{
std::cout << is_array<int>::value << std::endl;
std::cout << is_array<int[]>::value << std::endl;
std::cout << is_array<int[]>::value << std::endl;
std::cout << is_class<int>::value << std::endl;
std::cout << is_class<testA>::value << std::endl;
return ;
}
至于刘未鹏(地址见文章最后参考列表)
所说的traits 用于效率一说 我觉得也算是分发到不同处理流程中的一种使用方法。
解决C++代码中某些无法编译的问题 则是说使用traits避开一些问题
比如引用的引用。
参考:
1 boost源码剖析之:泛型编程精灵type_traits(rev#2) http://blog.csdn.net/pongba/article/details/83828
boost学习 泛型编程之traits 学习的更多相关文章
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...
- C#可扩展编程之MEF学习
MEF系列文章: C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import) C#可扩展编程之MEF学习 ...
- c# .Net并行和多线程编程之Task学习记录!
任务Task和线程Thread的区别: 1.任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行. 2.任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶(转)
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻(转)
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
随机推荐
- 收藏Dotnetbar的官方学习链接
Archive for the DotNetBar for Windows Forms Category: http://www.devcomponents.com/kb2/?cat=3 视频教程: ...
- mongodb 超出内存限制
mongodb 查询数据默认占用最大内存为100M,如果查询涉及到大量数据进行$group.$sort时会抛出类似以下的异常: Received error :: { $err: \"Exc ...
- 读取Excel的部分问题
1.office分很多版本,导致Excel连接字符串不同. 2.是否有标题头的问题(在连接字符串中设置) 3.Excel本身删除分数据删除和表格结构删除.普通delete只能删除数据, 还是能读取到表 ...
- MYSQL ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.10.210' (111) 解决方法
今天在测试MySQL的连接时候,发现连接不通过,并报错ERROR 2003 (HY000): Can't connect to mysql server on '192.168.10.210' (11 ...
- Python打包之pyinstaller
Pyinstaller 进行对应目录下的打包 执行完后请注意建议将该m2的拷贝走 加了参数-w后不会出现黑色控制台的窗子 常用参数说明: –icon=图标路径 -F 打包成一个exe文件 -w 使用窗 ...
- note 3 变量与简单I/O
变量(Variable) 用于引用(绑定对象的标识符) 语法 变量名=对象(数值.表达式等) 增量赋值运算符 count = count + 1 简写 count += 1 标识符(Identifie ...
- 知识点:Mysql 基本用法之存储过程
存储过程 一. 介绍 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql 使用存储过程的优点: 用于替代程序写的SQL语句,实现程序与sql ...
- word embeddding和keras中的embedding
训练好的词向量模型被保存下来,该模型的本质就是一个m*n的矩阵,m代表训练语料中词的个数,n代表训练时我们设定的词向量维度.当我们训练好模型后再次调用时,就可以从该模型中直接获取到对应词的词向量. 通 ...
- mybatis的简单使用调用mapper接口
mybatis 是apache下的一个面向sql编程的半自动化的ORM持久层的框架.特点:面向sql编程,达到高性能的使用目的. 下面是简单使用 现导入jar包,只有mybatis和数据库驱动包(这里 ...
- Vue proxy
npm run dev 我们访问的是localhost:8080 config文件夹下的index.js配置文件的dev dev: { env: require('./dev.env'), port: ...