文档章节

Meta: 模板成员函数.

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/03/27 20:27
字数 659
阅读 79
收藏 1

运用好模板成员函数可以使得当前class具有兼容性:

比如我们定义了一个template-class: Node<T>接着我们实例化出来Node<int> first_(5)和Node<double> second_(0.5),我们想让first_ = second.怎么办呢,这个时候模板成员函数就派上了用场.

我们一般称:模板成员函数为 泛化成员函数.

泛化的成员模板随之也带来两个问题,这要追溯二个性质:

1,就是两个分别实例化的模板是没有联系的。比如Node<int>(5)和Node<int>(6)这两个实例化的结果就像马嘴和牛屁股没有任何联系.

2,泛化构成员函数并不会影响编译器合成自己的拷贝构造函数,移动构造函数,拷贝复制运算符,移动赋值运算符.....因此我们要想获得对当前template-class的精确控制也必须声明定义出来这些函数.

3,构造函数是不需要泛化的!!!!!!!!!!!!!!!!!!!!!!!!!!!!

我们来看一下代码吧:

#include <iostream> 


template<typename T>
class Node{
private:
T key_;

public:
Node()=default;

explicit Node(const T& key);  //构造函数.


Node(const Node<T>& other_node_); //普通拷贝构造函数.

template<typename Ty>
Node(const Node<Ty>& other_node_); //泛化拷贝构造函数.

template<typename Ty>
Node(Node<Ty>&& other_node_);  //泛化移动构造函数.

Node(Node<T>&& other_node_); //普通移动构造函数.

Node<T>& operator=(const Node<T>& other_node_); //普通拷贝赋值运算符.

template<typename Ty>
Node<T>& operator=(const Node<Ty>& other_node_); //泛化拷贝复制运算符.

Node<T>& operator=(Node<T>&& other_node_);  //普通移动复制运算符.

template<typename Ty>
Node<T>& operator=(Node<Ty>&& other_node_); //泛化移动赋值运算符.

inline T get()const
{
return this->key_;
}

inline T& get()
{
	return this->key_;
}

inline void print()const
{
 std::cout<<"key_: "<<this->key_<<std::endl;
}

 ~Node()=default;
};

template<typename T>
Node<T>::Node(const T& key)
        :key_(key)
{
	//
}


template<typename T>
Node<T>::Node(const Node<T>& other_node_)
        :key_(other_node_.key)
{
	//
}


template<typename T>
template<typename Ty>
Node<T>::Node(const Node<Ty>& other_node_)
        :key_(other_node_.get())
{
	//
} 

template<typename T>
Node<T>::Node(Node<T>&& other_node_)
        :key_(std::move(other_node_.key_))
{
	//
}


template<typename T>
template<typename Ty>
Node<T>::Node(Node<Ty>&& other_node_)
        :key_(std::move(other_node_.get()))
{
	
} 

template<typename T>
Node<T>& Node<T>::operator=(const Node<T>& other_node_)
{
	this->key_ = other_node_.key_;
	return *this;
}



template<typename T>
template<typename Ty>
Node<T>& Node<T>::operator=(const Node<Ty>& other_node_)  //注意这里的返回类型. 
{
	this->key_ = other_node_.get();
	
	return *this;
}


template<typename T>
Node<T>& Node<T>::operator=(Node<T>&& other_node_)
{
	this->key_ = std::move(other_node_.key_);
	return *this;
}


template<typename T>
template<typename Ty>
Node<T>& Node<T>::operator=(Node<Ty>&& other_node_)
{
	this->key_ = std::move(other_node_.get());
	return *this;
} 

int main()
{
	//case 1:
	Node<int> nodeOne(0.5); //从double 到 int. 
	nodeOne.print();        
	
	//case 2:
	Node<int> nodeTwo(20);
	Node<double> nodeThree(30.5);
	nodeTwo = nodeThree;  //从double 到 int, 
	nodeTwo.print();
	
	//case 3:
	Node<int> nodeFour(Node<double>(4.880));
	nodeFour.print();
	
	//case 4:
	Node<int> nodeFive(20);
	nodeFive = Node<double>(10.11);
	nodeFive.print();
	
	return 0;
}

 

© 著作权归作者所有

下一篇: Effective C++: const
SHIHUAMarryMe
粉丝 13
博文 162
码字总数 138435
作品 0
武汉
程序员
私信 提问
android的binder机制研究(C++部分)

(一) 概述 android的binder机制提供一种进程间通信的方法,使一个进程可以以类似远程过程调用的形式调用另一个进程所提供的功能。binder机制在Java环境和C/C++环境都有提供。 android的代码...

eric_zhang
2011/07/20
5.4K
1
七日Python之路--第十二天(Django Web 开发指南)

《Django Web 开发指南》。貌似使用Django1.0版本,基本内容差不多,细读无妨。地址:http://www.jb51.net/books/76079.html (一)第一部分 入门 (1)内置数字工厂函数 int(12.34)会创建一...

明天以后
2014/08/09
951
0
10-C++远征之模板篇-学习笔记

C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 & 静态成员函数 运算符重载: 一切皆有可能 友元函数 函数定义分类: 友元全局函数 例子:...

天涯明月笙
2018/07/24
0
0
Caffe2核心代码解析系列之五:Blob

介绍 Caffe2中Blob的概念应该来自于Caffe。它是有类型的内存抽象,主要包含两个成员,一为指向存储元素的指针,另一则为此元素的类型(TypeMeta)。这么说来它其实与Tensor好像,本质上它有些赘...

manofmountain
2018/09/20
0
0
C++ primer第二次阅读学习笔记(第16章:模板与泛型编程) .

第十六章:模板与泛型编程 所谓泛型编程就是以独立于任何特定类型的方式编程。使用时,我们需要提供具体程序实例所操作的类型或值。标准库的容器、迭代器和算法都是泛型编程的例子。 模板是泛...

长平狐
2012/10/08
65
0

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
3
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
5
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部