//############################################################################
/*
* 模板介绍
*/
//函数模板
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的更多相关文章

  1. 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  2. 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  3. C++ - 模板(template)中typename的使用方法

    声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...

  4. C++ 进阶 模板和STL

    C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 模板的特点: 模板不可以直接使用,它只 ...

  5. Java进阶1. Synchronized 关键字

    Java进阶1. Synchronized 关键字 20131025 1.关于synchronized的简介: Synchronized 关键字代表对这个方法加锁,相当于不管那一个线程,运行到这个方法 ...

  6. C++ 类模板四(typename关键字)

  7. [转] 关于C++中模板中的typename和class的区别比较

    C++箴言:理解typename的两个含义 转自http://blog.csdn.net/dick_china/article/details/4522253 问题:在下面的 template dec ...

  8. OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)

    自从OpenCV推出了Mat后越来越像是Matlab了,使用起来方便了很多,但是,在用at方法访问Mat时,如何选用合适的typename类型来访问相应的Mat元素是个头疼的问题. 比如: int H ...

  9. ansible进阶模板和角色使用

    使用场景 Ansible 由于采用ssh远程连接登录管理,虽然不需要额外安装agent,但是速度慢效率低.不适合管理大规模的主机一般最大规模在200-300台,超大规模的主机管理适合使用puppet ...

随机推荐

  1. Vue.js学习使用心得(三)

    一.计算属性 计算属性关键词: computed <body> <div id="app"> <p>原始字符串: {{ message }}&l ...

  2. Beta周第14次Scrum会议(11/23)【王者荣耀交流协会】

    一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/23 17:02~17:14,总计12min. ...

  3. 基本数据类型,数字int字符串str

    基本数据类型 数字 int 字符串 str 布尔值 bool 列表 list 字典 dict 元组 tuple(待续...) 整数 int - 创建 a = 123 a = int(123) - 转换 ...

  4. java知识整理

    整理一下Java知识点. 一.final finally finalize区别 1.final 修饰符(关键字).被final修饰的类,不能再派生出新的子类,不能作为父类而被子类继承.因此一个类不能既 ...

  5. 【git】一台机器上使用不同的git账号

    1.生成一个新的自定义名称的公钥: ssh-keygen -t rsa -C "shangxiaofei3@163.com" -f ~/.ssh/sxfself 一直点击回车 执行 ...

  6. "ERR unknown command 'cluster'"

    golang 连接redis 集群提示  "ERR unknown command 'cluster'" redisdb = redis.NewClusterClient(& ...

  7. Map的嵌套使用

    Map嵌套Map: 例: AAA: Javas班: 001 熊大 002 熊二 Hdoop班 001 小猪猪 002 小菲菲 ★使用增强for循环遍历Set数组: import java.util.H ...

  8. IE浏览器兼容问题

    文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. 为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE8引入 ...

  9. 13机器学习实战之PCA(2)

    PCA——主成分分析 简介 PCA全称Principal Component Analysis,即主成分分析,是一种常用的数据降维方法.它可以通过线性变换将原始数据变换为一组各维度线性无关的表示,以此 ...

  10. S老师 C#编程数据结构篇 学习

    直接插入排序                                                       冒泡排序 简单选择排序 线性表: using System; using Sy ...