C++ Template之技巧性基础知识
1.对于T是自定义类型的,如果存在子类型则需要在模版内部加上typename
示例代码:
template<typename T>
class Myclass
{
typename T::SubType *ptr;//需要加上typename不然编译器可能误解为是静态对象SubType和ptr相乘
};
2.类模版里对基类成员函数的调用使用BASE::exit();和this->,避免调用的是外部全局函数,但是在vc6.0上面这条规则是先调用的BASE里面的函数。
示例代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std; void exit()
{
cout << "hello world" <<endl;
}
template <typename T>
class BaseMyclass
{
public:
void exit()
{
cout << "Base" <<endl;
}
}; template <typename T>
class Myclass:public BaseMyclass<T>
{ public: void foo()
{
exit();
}
}; int main()
{
Myclass<int> m1;
m1.foo(); return 0;
}
3.成员模板,由于两种不同的类型之间的赋值不能使用类本身的接口,所以需要重新设计接口。
示例代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std; template <typename T>
class Stack
{
public:
template <typename T2>
Stack<T>& operator=(Stack<T2> const &);
};
template <typename T>
template <typename T2>
Stack<T>& Stack<T>::operator=(Stack<T2> const &op2)
{ } int main()
{ return 0;
}
调用时首先通过显式指定的模板类型实例化一个类,然后通过实例化一个成员函数,只是现在的成员函数是模板函数,然后根据调用的参数实例化成一个成员函数。
4.模板的模板参数,实际上是一个模板类,上面的成员模板实际上是一个模板函数。
代码示例:
template <typename T,template<typename T> class CONT = vector>
class Stack
{
public: };
5.零初始化,因为模板不知道类型所以我们无法用任何一个常量来初始化模板参数定义的变量。但是可以如下例子进行初始化
代码示例:
#include <iostream>
#include <string>
#include <vector>
using namespace std; template <typename T>
void foo()
{
T x = T();
} template <typename T>
class Myclass
{
private:
T x;
public:
Myclass():x(T()){}
}; int main()
{
foo<int>();
Myclass<int> m1;
return 0;
}
6.使用字符串作为函数模板的实参若是引用则需要字符串长度完全匹配
示例代码:
template <typename T>
inline T& const max(T const& a,T const& b)
{
return a > b ? a:b;
} int main()
{
cout << max("apple","peach")<<endl;//OK
cout << max("apple","tomato")<<endl;//ERROR
return 0;
}
若不为引用则不需要字符串长度完全一样,原因是参数会转换成字符串指针类型,属于相同的类型
示例代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std; template <typename T>
inline T max(T a,T b)
{
return a > b ? a:b;
} int main()
{
cout << max("apple","peach")<<endl;//OK
cout << max("apple","tomato")<<endl;//OK
return 0;
}
字符串作为实参的测试示例:
template <typename T>
void ref(T const& x,T const& y)
{
cout << "x int the ref is " << typeid(x).name() <<endl;
} template <typename T>
void nonref(T x)
{
cout << "x int the noref is " << typeid(x).name() <<endl;
}
int main()
{
ref("hello");
nonref("hello"); return 0;
}
C++ Template之技巧性基础知识的更多相关文章
- java基础知识 多线程
package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...
- Oracle数据库基础知识
oracle数据库plsql developer 目录(?)[-] 一 SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...
- C++ 顺序容器基础知识总结
0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...
- WPF基础知识、界面布局及控件Binding(转)
WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...
- WPF基础知识、界面布局及控件Binding
WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...
- 浅析C++基础知识
近期想对C++的面试题目进行一下更加详细的整理.事实上认真思考一下C++程序猿的面试,我们能够发现对程序猿的能力的考察总是万变不离当中,这些基础知识主要分为五部分:一. C/C++基础知识 二. C/ ...
- 【流量】netflow 基础知识
摘要 记录下关于netflow的基础知识以及应用,现状 是什么 一种数据交换方式,NetFlow流量统计数据包括数据流时戳 源IP地址和目的IP地址 源端口号和目的端口号 输入接口号和输出接口号 下一 ...
- Vue.js-08:第八章 - 组件的基础知识
一.前言 在之前的学习中,我们对于 Vue 的一些基础语法进行了简单的了解,通过之前的代码可以清晰的看出,我们在使用 Vue 的整个过程,最终都是在对 Vue 实例进行的一系列操作. 这里就会引出一个 ...
- 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性
[源码下载] 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件 ...
随机推荐
- 文本处理命令--wc、sed
一.wc wc命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 测试文件内容: (my_python_env)[root@hadoop26 ~]# cat test hnlinu ...
- luigi学习5-task详解
task是代码执行的地方.task通过target互相依赖. 下面是一个典型的task的大纲视图. 一.Task.requires requires方法用来指定本task的依赖的其他task对象,依赖 ...
- php 实现多线程
通过php的Socket方式实现php程序的多线程.php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的.每一个访问者,当访问WEB页面的时候,都将 ...
- PHP通过IP 获取 地理位置(实例)
发布:JB02 来源:脚本学堂 分享一例php代码,实现通过IP地址获取访问者的地理位置,在php编程中经常用到,有需要的朋友参考下吧.本节内容:PHP通过IP获取地理位置 例子: 复制代码代码 ...
- input元素的padding border margin的区别
padding内(不包含padding)的部分才是可输入部分,也是width和height标明的区域.padding的部分加上width和height部分是background的部分.padding的 ...
- 在Javascript操作JSON对象,增加 删除 修改
在Javascript操作JSON对象,增加删除修改全有的,详情见代码 <script type="text/javascript"> var jsonObj2 = { ...
- 图表控件MsChart使用demo
chart 控件主要有 Titles 标题集合 Chart Area图形显示区域 Series图表集合 Legends图列的集合 (1) 常用事件: 1. Series1.Points.DataB ...
- 在EF的code frist下写稳健的权限管理系统:MVC过滤拦截,权限核心(五)
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = ...
- Python入门和基础
Python应用领域 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube ...
- 线程操作API
线程操作API 1.currentThread 2.getId() .getName().getPriority().getStart.isAlive().isDaemon().isInterrupt ...