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 ...
随机推荐
- supervisor-program配置
[program:check_server_state]directory=/sunlight/shellcommand=/usr/bin/sh check_server_state.shautost ...
- 将scrapy项目运行在pycharm中
1.在scrapy项目中创建一个py脚本,且尽量在scrapy.cfg同级目录下.我创建的是begin.py 2.配置begin.py.写上这一句就相等于一点开始,就在终端上输入了scrapy cra ...
- Codeforces483B. Friends and Presents(二分+容斥原理)
题目链接:传送门 题目: B. Friends and Presents time limit per test second memory limit per test megabytes inpu ...
- weixin-java-mp集成微信公众号自带客服功能
电脑端登录公众号管理后台,[添加功能插件]开通客服功能,输入"人工客服"接入客服热线 底部有我的微信二维码,如有问题,可加好友进行技术交流! weixi ...
- C# 敏捷1
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...
- 【BZOJ4552】【TJOI2016】【HEOI2016】排序
经验还是不够…… 原题: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对 ...
- 更改MySQL数据库的编码为utf8mb4
原文:http://blog.csdn.net/woslx/article/details/49685111 utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3 ...
- nginx日志分割配置实例
Nginx没有类似Apache的cronolog日志分割处理的功能,但是,可以通过nginxNginx的信号控制功能利用脚本来实现日志的自动切割.请看下面的一个实例.Nginx对日志进行处理的脚本: ...
- Unity 官方教程 学习
Interface & Essentials Using the Unity Interface 1.Interface Overview https://unity3d.com/cn/lea ...
- C#模拟键盘按键的三种方式实现
1.System.Windows.Forms.SendKeys 组合键:Ctrl = ^ .Shift = + .Alt = % 模拟按键:A private void button1_Click(o ...