C++进阶--模板及关键字typename
//############################################################################
/*
* 模板介绍
*/
//函数模板
template<typename T>
T square(T x) {
return x*x;
}
//类模板
template<typename T>
class BoVector {
T arr[1000];
int size;
public:
BoVector():size(0) {}
void push(T x) { arr[size] = x; size++; }
T get(int i) const { return arr[i]; }
int getSize() const { return size; }
//void print() const {for(int i=0; i<size; i++) {cout << arr[i] << endl;}}
void print() const {
const int* p = arr;
for(int i=0; i<size; i++) {cout << *(p++) << endl;}
}
};
template<typename T>
BoVector<T> operator*(const BoVector<T>& rhs1, BoVector<T>& rhs2) {
BoVector<T> ret;
for (int i=0; i<rhs1.getSize(); i++) {
ret.push(rhs1.get(i)*rhs2.get(i));
}
return ret;
}
int main()
{
cout << square(5) << endl;
BoVector<int> bv;
bv.push(2);
bv.push(5);
bv.push(8);
bv.push(9);
bv.print();
cout << "Print squared bv: " << endl;
bv = square(bv);
bv.print();
}
//############################################################################
/*
* 函数模板类型省略
*/
template<class T>
void f() {
...
}
int main() {
f<int>(); // T显式指定
}
// 类型T可以省略
template<class T>
void f(T t) {
...
}
int main() {
f(67); // 编译将其绑定为int型
f<long>(67); // 显示告诉编译器为long类型
f(67L);
}
//############################################################################
/*
* 关键字typename及其用法
*/
template<class T>
void printAge(T& item) {
...
}
template<typename T>
void printAge(T& item) {
...
}
//用于模板参数两者等效
//使用typename更易理解
//
/*
* Dependent Type 取决于模板参数的类型
*/
template<typename T> A {
vector<T> vec;
}
/*
* Nested Dependent Type 包含在某个类里的dependent type
*/
template<typename T> A {
T::age myAge = 9;
vector<T>::iterator itr;
}
/*
* typename 用法二
*/
class Dog {
public:
typedef int age;
};
template<class T>
void printMyAge(T& item) {
int n = 9;
T::age* a = &n;
cout << (*a) << endl;
}
int main() {
Dog d;
printMyAge<Dog>(d);
}
// 上面的代码编译不过,T::age是类型,编译器当成变量
//class Wolf {
// public:
// int age;
//};
/*
* 法则: 当使用嵌套依赖类型的时候总是在前面加上typename,告诉编译器这是类型
*/
// 例外: 在基类列表或者初始化列表中
template<typename T>
class D : public T::NestedBaseClass {
public:
D(int x) : T::NestedBaseClass(x) {
typename T::NestedBaseClass y;
...
}
}
//############################################################################
/*
* 模板特化和偏特化
*/
// std是一个特殊的命名空间,我们不能更改它的内容,但是可以为我们的类型提供特化的版本
C++进阶--模板及关键字typename的更多相关文章
- 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...
- 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...
- C++ - 模板(template)中typename的使用方法
声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...
- C++ 进阶 模板和STL
C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 模板的特点: 模板不可以直接使用,它只 ...
- Java进阶1. Synchronized 关键字
Java进阶1. Synchronized 关键字 20131025 1.关于synchronized的简介: Synchronized 关键字代表对这个方法加锁,相当于不管那一个线程,运行到这个方法 ...
- C++ 类模板四(typename关键字)
- [转] 关于C++中模板中的typename和class的区别比较
C++箴言:理解typename的两个含义 转自http://blog.csdn.net/dick_china/article/details/4522253 问题:在下面的 template dec ...
- OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)
自从OpenCV推出了Mat后越来越像是Matlab了,使用起来方便了很多,但是,在用at方法访问Mat时,如何选用合适的typename类型来访问相应的Mat元素是个头疼的问题. 比如: int H ...
- ansible进阶模板和角色使用
使用场景 Ansible 由于采用ssh远程连接登录管理,虽然不需要额外安装agent,但是速度慢效率低.不适合管理大规模的主机一般最大规模在200-300台,超大规模的主机管理适合使用puppet ...
随机推荐
- 百练6247-过滤多余的空格-2015正式B题
B:过滤多余的空格 总时间限制: 1000ms 内存限制: 65536kB 描述 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格. 输入 一行,一个字符串(长度不超过200),句子的 ...
- JAVA基础部分复习(一、8中基础类型,以及String相关内容)
以下是关于java中8种基本类型的介绍说明: package cn.review.day01; /** * java基础复习,8种数据类型 * (byte,short,long,int,double, ...
- 获取div,表单中的内容
获得内容 - text().html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元 ...
- pytonn04day
参考: https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions 一列表 它是以[ ]括起来, 每个元素⽤用 ...
- Arrays ---------------copyOf赋值
- Ubuntu下一个好用的终端
在终端下输入: sudo apt-get install terminator 快捷键: shift+ctrl+e 在当前窗口右侧新开一个窗口 shift+ctrl+w ...
- 《DSP using MATLAB》Problem 6.18
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- python.numpy.std()计算矩阵标准差
>>> a = np.array([[1, 2], [3, 4]]) >>> np.std(a) # 计算全局标准差 1.1180339887498949 > ...
- CentOS7.1 KVM虚拟化之环境准备
备注:实验没有问题,只是暂时还不知道弄这个用来干嘛,不过先留着以后查看吧 一.基础平台 1.一台装有VMware的Windows系统 (可联网) 2.CentOS7.1 64bit 镜像 二.最小化安 ...
- pushpin Server-sent events && openresty 集成试用
前边有写过一个简单pushpin 集成stream 的demo,这次测试下sse 的功能 备注: 环境依然使用的是docker-compose运行 环境准备 docker-compose 文件 ver ...