
C++模板
文章平均质量分 79
写了程序换酒钱
Want to be a geek!!!
展开
-
C++模板来源
早期的面向对象的语言smalltalk是通过继承来实现代码的重用,在做包容期器的时候,是通过“基于object的层次结构”来实现的,smalltalk中是单继承,object是树型的根,每一个类都继承树上的一枝。但是在C++中支持多个无关联的层次结构,所以“基于object的层次结构”不能很好的起作用。通过多重继承可以实现,同时继承自无关联的类和object类可以实现,可是C++开始并不支持多重继原创 2013-02-24 13:17:52 · 980 阅读 · 0 评论 -
线性表链接实现--双循环链表
在实现时没有引入两个辅助节点,所以实现时需要考虑特殊情况,比如头和尾插入删除操作时,需要改变指向头和尾的指针。在做迭代器的时候还有麻烦,遍历链表时需要借助量表的长度,不然不能标识结束,我想到的办法是在迭代器中做一些记录工作,比如当前的下标和整个链表的长度。有解决办法的希望指教。 #ifndef LINKLIST_H#define LINKLIST_H原创 2013-05-07 22:47:53 · 1083 阅读 · 0 评论 -
队列的顺序和链接
链接借助前面的双循环链表实现 #ifndef QUEUE_HPP#define QUEUE_HPP#include #include "exceptions.hpp"template class Queue{public: Queue(){} virtual ~Queue() {} /** * @brief原创 2013-05-09 22:45:24 · 965 阅读 · 0 评论 -
栈的顺序实现和链接实现
#ifndef STACK_HPP#define STACK_HPP#include #include "exceptions.hpp"template /** * @brief The Stack class 栈基类 */class Stack{public: Stack() {} virtual ~Stack(){} /** * @br原创 2013-05-09 12:30:06 · 1063 阅读 · 0 评论 -
平衡二叉树
二叉树的查找,插入和删除操作的时间与树的高度有关,如果树尽量的矮胖,那么时间就短,那就要是满二叉树,或者说满N叉树,对于一颗M个节点的满N叉树时间复杂度为,但是维护满叉树,难度是很大的。所以AVL树(平衡树)放宽了条件,允许左右子树的高度差在一定的范围之内,avl树平衡条件是左右子树高度相差不能为2,而不是满叉树左右子树高度相同。AVL是以提出它的两位苏联数学家的名字头字母命名的。一棵N个节点的A原创 2013-05-24 18:24:16 · 1106 阅读 · 0 评论 -
Qt元对象系统和模板机制的冲突
Qt元对象系统是对为了Qt对象类型和信号与槽机制引进的,Qt的工具包中有一个元对象编译器,它是为支持Qt元对象系统而产生一些额外C++代码,这些编码会和源码一起被标准的C++编译器编译,因为Qt的这一套标准是不支持的,但是可以实现,说白了就是在标准编译器编译前的一个预处理。C++的模板机制是代码重用,其实现在已经不只是这些。如果有兴趣可以了解一些C++的最新的研究方面,比如模板元编程,繁殖性编原创 2013-06-07 18:51:24 · 2271 阅读 · 1 评论 -
实现signal和slot机制(2)-跨线程投递
前言在1中,我们实现了一个基础的signal+slot的模块件调用机制,不过那个direct调用,在这篇中,我们将支持夸线程调用,即在对象的线程上下文中,调用对象的函数。对象线程绑定在qt中,有一个很重要的概念,对象线程绑定,即在每个对象实例时候,其保存其线程上下文信息,其中就有一个事件循环,跨线程的信号就是将这个一个task丢到这个事件循环中,在对象绑定的线程中完成slot响应。实现对slot调用原创 2015-06-04 21:08:27 · 3790 阅读 · 0 评论 -
C++怎么判断一个类存在指定的函数名的函数
C++怎么获得一个类存在指定的函数名的函数怎么在编译期获得一个类是否存在指定函数名的函数?#define HAS_MEMBER(member)\ template<typename T, typename... Args>struct has_member_##member\{\private:\ template<typename U> static auto Check(in原创 2015-08-05 12:28:30 · 7328 阅读 · 0 评论 -
C++中怎么对野指针进行防护
一直从事C++底层库的开发,这里以监听模式来示例野指针的防护。底层通知上层,一种方式是,底层提供一个监听接口类,上层实现,然后注册下来,一般是有注册就有反注册,可以把下层安全压在上层使用者,在释放这个监听接口类之前进行反注册,这个就太不明智,那么我们就需要基于框架设计能防护野指针破坏,这里我们提供一个Guard机制。 `Guard`翻译过来的意思就是`警卫`,顾名思义就是用来防护的。先看其实现:c原创 2015-11-14 10:36:25 · 1891 阅读 · 0 评论 -
实现类似于Qt的Signal和Slot通讯机制
Signal和Slot机制其实qt提供的对象间通讯机制。实现细节思路实现类似与信号与槽的机制,无非就是做一些薄记工作,qt中通过虚函数和moc来实现。那我们怎么实现?我的思路是signal是一个对象,其他的slot将自己的回调注册进signal对象中,signal完成薄记工作。那么需要实现的细节归于一下几点。 1. 参数的提取与匹配。 2. slot容器的制作。 3. slot的调用。 参数原创 2015-05-08 20:40:23 · 2928 阅读 · 2 评论 -
基于C++11的事件驱动框架
闲来无事,系统捣鼓C++。之前在signal-slot中提到事件循环,不过那个实在写的太挫。现在写了一个说的过去的。项目地址: https://github.com/ZhouBox/moos.git下面简单的说明下。 task完成实现对事件循环的一个任务的封装。 task_policy实现了各种task的策略。 task_queue是事件队列 looper是一个事件循环。 moos_原创 2016-04-06 21:05:20 · 12396 阅读 · 2 评论 -
二叉搜索树
二叉搜索树也是二叉树,不过多了一些限定,根节点值大于左子树小于右子树,子树递归定义。 /**************************************************author:周翔*e-mail:604487178@qq.com*blog:http://blog.youkuaiyun.com/zhx6044***********原创 2013-05-19 18:52:40 · 982 阅读 · 0 评论 -
内存池
单线程内存池,通过模板技术,可以给单线程池加上不同的锁,以此来实现多线程内存池 #ifndef MEMORYPOOL_H#define MEMORYPOOL_H#include template /** * @brief The MemoryPool class 单线程 */class MemoryPool{public: Me原创 2013-05-20 13:41:31 · 992 阅读 · 0 评论 -
二叉树
/**************************************************author:周翔*e-mail:604487178@qq.com*blog:http://blog.youkuaiyun.com/zhx6044***************************************************/#include "linkQueue.h原创 2013-05-16 23:33:12 · 1021 阅读 · 0 评论 -
类模板和函数模板
模板一般分为模板函数和类模板。 模板函数的一般形式为: template 返回值类型 函数名(参数列表){函数体} 类模板的一般形式为: template class 类名 {类声明体} 类中成员函数的类外实现原创 2013-02-24 14:26:31 · 868 阅读 · 0 评论 -
模板参数
模板参数可以是某些类型或者非类型。类型参数需用使用typename或class关键字才指定。 如下: template class className{...} template class className{...} 非类型的参数就是通常的原创 2013-02-24 14:55:52 · 2673 阅读 · 2 评论 -
关键字typename
单从字面理解,typename拆分开来type(类型)name(名),可以理解用来说明什么是一个类型。 在写模板时,我们使用T来代表类型,但前面一定需要typename,那是告诉编译器什么是可以替换的。 看一个例子 #include using namespace std;原创 2013-02-26 12:29:18 · 2006 阅读 · 0 评论 -
模板元编程(二)
C++模板元编程是让编译器提前完成一些运行期的工作,这样提高了程序的运行期速度。 由编译器完成,那些只能在编译器做工作,可是在编译器能使用的东西很少。 模板机制是C++除了继承之外的代码重用的一项关键的机制,它在编译器完成模板的实例化的特性满足了能在编译期做工作的基本条件。原创 2013-03-30 13:37:34 · 990 阅读 · 0 评论 -
怎么样减少模板特化的代码臃肿
模板机制实现的代码的复用,但是却引入了新的问题。比如我们有一个Vector模板,我们需要存放int*,double*,char*三种不同的参数,这是就会产成出三套代码,显然这是导致臃肿的原因。 下面看一个例子。#include using namespace std;template class zVector{public: z原创 2013-03-18 18:47:45 · 1502 阅读 · 0 评论 -
模板特化疑问
最近在学习模板,对模板特化做了一些实验 下面是代码#include using namespace std;#include template class zVector{public: /** * @brief zVector * @param size */ zVector(int size = 10):m_size原创 2013-03-18 22:03:49 · 1121 阅读 · 0 评论 -
模板元编程练习
#include template struct trais{ typedef T value_type;};templatestruct trais{ typedef typename trais::value_type value_type;};templatestruct trais{ typedef typename trais::val原创 2013-04-02 13:06:53 · 1086 阅读 · 0 评论 -
C++11可变参数函数模板
在Log时参数是类型和个数是不固定的,所以在做log函数时,很多烦恼,不过C++11给我们带来的希望这个是今天刚读到的,加上自己的理解为字节写了一个logger类,也给大家瞧瞧啊,欢迎大虾拍板转 #include #include using namespace std;class Logger {public: /**原创 2013-04-27 13:34:07 · 5537 阅读 · 0 评论 -
模板元编程练习
编写一个一元元函数add_const_ref,如果T是一个引用类型,就返回T,否则返回T const&。#ifndef T1_H#define T1_Htemplate struct add_const_ref{ typedef const T& type_value;};template struct add_const_ref{原创 2013-04-10 20:07:01 · 1327 阅读 · 0 评论 -
栈和二叉树的使用--四则运算
使用栈来检测表达式括号的匹配,使用二叉树来保存运算的中缀表达式,对表达式树进行后序遍历得到后缀表达式,运算得到表达式的值。 检测配对使用栈保存‘(’符号,当遇到一个‘)’,出栈,若栈空则出错,表达式结束,栈非空也出错。 <!--p {margin-bottom:原创 2013-05-13 21:41:16 · 5716 阅读 · 0 评论 -
优先级队列
/**************************************************author:周翔*e-mail:604487178@qq.com*blog:http://blog.youkuaiyun.com/zhx6044***************************************************/#ifndef PRIORITYQUEUE原创 2013-05-18 20:09:54 · 899 阅读 · 0 评论 -
利用可变模板参数实现log功能
在以前的博文中,写过类似的课题。使用的是下面这种方法。// 递归出口template <typename T>void logOld(const T& t){ std::cout << t << '\n';}// 递归展开template <typename T, typename ... Args>void logOld(const T& t, const Args& ...原创 2016-03-19 17:10:21 · 4404 阅读 · 18 评论