模板类

Chromium的智能指针/引用计数/Callback/Bind

风格不统一 提交于 2019-12-27 21:35:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这四个东西对使用者来说不难,看懂代码注释里的例子即可,预计1小时左右看懂全部。要去理解其设计思想的话最需要掌握的是模板类的使用,但一般使用者完全不用关心怎么设计的。 使用者的学习路径: 1.智能删除指针scoped_ptr 用作对普通指针的转储,防止忘记delete或不知道哪里delete。它跟引用计数没有关系。 头文件的注释就是使用示例 http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr.h template <class T, class D = base::DefaultDeleter<T> > class scoped_ptr 其中Deleter可以被替换,默认的Deleter区分是要delete普通指针还是指针数组,或者用free函数删除malloc的内存。 2. ScopedVector http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_vector.h 在析构时会delete其元素的vector,知道它的行为即可。 3.带引用计数的类 http://src.chromium.org/viewvc/chrome/trunk

数组模板类-MyVector

余生长醉 提交于 2019-12-21 07:09:18
实现非常简单的数组模板类(MyVector)中用到了泛型编程(模板类编程)、运算符重载、友元函数等知识,最重要的是加深了对内存分配的理解。 所有容器提供的都是值(value)语意,而非引用(reference)语意。 容器执行插入元素的操作时,内部实施拷贝动作。 所以STL容器内存储的元素必须 能够被拷贝 (必须提供拷贝构造函数)。 开始的时候不理解这句话,然后自己敲代码就理解了。我们在往容器里存数据的时候,是进行拷贝动作,也就是说将外部变量的值拷贝给容器中的值。要进行拷贝就必须分配内存,没有分配内存的话往哪拷数据呢????而基础数据类型的变量是不用担心这些问题的,因为当我们写下 int a 时编译器已经为 a 分配了内存,但是如果是指针变量就必须考虑深拷贝与浅拷贝的问题(其实这个地方第一次的时候我想的是,MyVector不是已经分配了内存了吗,为什么还要分配呢?其实在MyVector中是给类分配了内存说白了就是给类中的成员变量分配了内存,而成员变量若有指针的话,它只是为指针分配了内存,而我们所需要的是分配指针所指向的内存空间分配内存)。 MyVector.h # pragma once # include <iostream> using namespace std ; template < typename Type > class MyVector { friend

springboot中使用redis

五迷三道 提交于 2019-12-19 23:29:15
https://www.cnblogs.com/nfcm/p/7833032.html redis连接工厂类 第一步,需要加上springboot的redis jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 然后我们写一个配置类,创建了一个redis连接的工厂的spring bean。(Redis连接工厂会生成到Redis数据库服务器的连接) @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisCF(){ //如果什么参数都不设置,默认连接本地6379端口 JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setPort(6379); factory.setHostName("localhost"); return factory; } } 单元测试,看看这个工厂方法的使用 @RunWith(SpringJUnit4ClassRunner.class)

C++模板编程中只特化模板类的一个成员函数

♀尐吖头ヾ 提交于 2019-12-19 20:36:41
模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护。 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 // 其他成员函数b 6 // ...... 7 void func() 8 { 9 std::cout << "common type." << std::endl; 10 } 11 }; 12 13 int main() 14 { 15 A<int> i; 16 i.func(); 17 18 A<char*> c; 19 c.func(); 20 21 return 0; 22 } 方法一:通过运行时类型识别,这个方法最简单 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 // 其他成员函数b 6 // ...... 7 void func() 8 { 9 if (typeid(_Ty) == typeid(char*)) 10

STL list 模板类的所有方法及演示

我只是一个虾纸丫 提交于 2019-12-15 05:02:44
list 的所有方法及演示(每一种方法的演示为单独的,不演示空间适配器) 首先包含我们的 头文件和命名空间: # include <iostream> # include <list> using std :: cout ; using std :: endl ; using std :: list ; 所有的方法及演示在下面的框架中实现: int main ( ) { . . . return 0 ; } 首先我们定义五个容量用于演示: list < int > list_arr1 ; // 默认构造 list < int > list_arr2 ( 5 , 3 ) ; // 构造五个元素的容器,并赋值为 3 list < int > list_arr3 ( 10 , 2 ) ; // 构造十个元素,并赋值为 2 list < int > list_arr4 ( list_arr3 ) ; // 复制构造 list < int > list_arr5 = list_arr4 ; // 赋值运算符重载 assign 重新设置元素个数 和值: list_arr1 . assign ( 5 , 5 ) ; // 重新容器元素为五个 且值为五 for ( auto & i : list_arr1 ) // C++ 11 { cout << i << " " ; } cout <<

前置模板类声明

折月煮酒 提交于 2019-12-09 16:53:24
由于某些原因不方便在头文件中直接引入另一个模板类的头文件,但声明变量是需要用到该模板类型,这时候就要用到模板类的前置声明了; 声明方式如下: namespace xx { template<typename T> class CBar; } 使用方式: xx::CBar<int> bar_; 来源: https://www.cnblogs.com/guoliushui/p/12011901.html

ATL实现的CDHtmlDialog模板类

你。 提交于 2019-12-07 11:14:17
ATL发展到现在,从未提供像MFC中的CDHtmlDialog一样的HTML页面布局且方便开发者使用的窗口基类,虽然也有DHtml Control可供使用,但并不能像MFC那样通过宏映射来方便地让开发者与页面元素之间进行任意的双向交互,尤其是需要响应页面元素事件的时候,ATL/WTL爱好者必须自己编写相应的代码来完成这些工作。 基于这个原因,通过理解分析MFC中CDHtmlDialog类的功能和实现行为,这里完全使用ATL一样的实现机制来模仿MFC中实现的功能编写了一个头文件,使ATL爱好者在无需MFC庞大的支持库的情形下实现跟CDHtmlDialog一样的功能,并且扩展了其能力。 在下载的压缩包中只有一个头文件 atldhtmldlg.h,头文件的开始部分是一段开发者使用示例的注释,以方便开发者容易地上手。这个文件提供了若干个类和模板类,开发者只需关注其中两个模板类:CDHtmlDialogImpl<>和CMultiPageDHtmlDialogImpl<>,第一个模板类实现了WEB页面布局的对话框,第二个模板类以第一个类为基础,扩展成了在一个对话框中支持多个页面。 使用方式非常简单,从上述两个模板类之一继承实现一个对话框类,然后添加相应的映射宏,实现宏映射中的方法即可构造一个完美、表现能力强、控制方便的对话框窗口,例子代码像下面这样: class CMainDlg :

ATL中的CWindowImpl模板类

感情迁移 提交于 2019-12-07 11:08:47
首先看一下这个模板类的声明 template < class T, class TBase = CWindow, class TWinTraits = CControlWinTraits> class CWindowImpl; 从声明中可以看出,有两个默认参数。 TBase是默认的窗口基类,这个CWindow简单封装了HWND,并且封装了几乎所有的Use32 APIs中以HWND为第一个参数的接口。CWindow提供一个共有的成员m_hWnd,可以直接处理HWND,也提供了一个operator HWND(),可以直接是CWindow作为需要HWND对象的函数参数。CWindow不同于MFC中的 CWnd。CWindow易于创建的,它不提供像MFC中的HWND到CWnd的对象关系。当CWindow对象超出作用域时,它被销毁,但是它关联的实际窗口不会被销毁。因此不需要detach你创建的临时的CWindow对象。 TWinTraits 是默认的窗口特征。 接下来,看一下它的定义的代码: template < class T, class TBase /* = CWindow */ , class TWinTraits /* = CControlWinTraits */ > class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT

c++ thread, 模板类,锁的调用实例

依然范特西╮ 提交于 2019-12-05 06:51:14
#include<thread> #include<condition_variable> #include<mutex> #include<queue> #include<stdio.h> template <class T> class ThreadSafeQueue{ public: void Insert(T value); void Popup(T &value); bool Empty() const; private: mutable std::mutex mut_; std::queue<T> que_; std::condition_variable cond_; }; template <class T> void ThreadSafeQueue<T>::Insert(T value){ std::lock_guard<std::mutex> lk(mut_); que_.push(value); cond_.notify_one(); } template <class T> void ThreadSafeQueue<T>::Popup(T &value){ std::unique_lock<std::mutex> lk(mut_); cond_.wait(lk, [this]{return !que_.empty();}); // 如果lamda表达式

IDEA类和方法注释模板设置

亡梦爱人 提交于 2019-12-03 23:44:56
IDEA类和方法注释模板设置 一、类注释模板设置 1. File--> settings--> Editor--> File and Code Templates--> Files /** * @ClassName ${NAME} * @Description: TODO * @Author ${USER} * @Date ${DATE} * @Version V1.0**/ 2. 效果演示: 二、方法注释模块设置 1. File--> Settings--> Editor--> Live Templates Template text: (注意留空一行) * @MethodName: $methodName$ * @Description: TODO * @Param: $param$ * @Return: $return$ * @Author: $user$ * @Date: $time$**/ 2. 效果演示( /** + a + tab ) 来源:https://www.cnblogs.com/heqiuyong/p/10335685.html 一、类注释模板设置 1. File--> settings--> Editor--> File and Code Templates--> Files /** * @ClassName ${NAME} * @Description: