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 之 控件(自定义控件) 自定义控件 ...
随机推荐
- Navicat Premium 11 For Mac 注册机
http://mac.pcbeta.com/thread-138357-1-1.html
- dedecms5.7 联动类型无法显示
dedecms5.7 联动类型无法显示 问题原因:一般是由于路径问题( 路径缺少分隔符'/' )导致js无法正常加载 如果遇到该类问题,尝试通过firebug工具检查js是否被正确加载. 如果是路径问 ...
- Java do while求和
用do while结构求0~100的整数数字之和. 代码如下: public class DoWhileDemo { public static void main(String[] args) { ...
- PHP-You don’t have permissions to access xxx on this server!
问题如下图: 如果你是想要查看目录下的每一个文件,那么你需要修改一下httpd-conf配置文件,也就是apache的配置文件,以phpStudy2013为例,如下图打开: 然后找到如下部分,添加 ...
- 利用HttpWebRequest访问WebApi
WebApi现在越来越流行,下面给出利用HttpWebRequest访问WebApi的工具方法: 1.利用基准URL和参数字典生成完整URL /// <summary> /// 生成URL ...
- linux下的声卡驱动架构
1.linux下的声卡驱动架构主要分为OSS架构和ALSA架构. 2.OSS架构 OSS全称是Open Sound System,叫做开放式音频系统,这种早期的音频系统这种基于文件系统的访问方式,这意 ...
- python 类属性和实例属性
class AAA(): aaa = 10 # 情形1 obj1 = AAA() obj2 = AAA() print obj1.aaa, obj2.aaa, AAA.aaa # 情形2 obj1.a ...
- Linux下自带的regex
Linux下可直接用regex.h来支持正则表达式. Android同样也有该头文件,可认为Android也是支持的. #include <sys/types.h> #include &l ...
- PHPStorm配置支持友好的Laravel代码自动提示
在项目的composer.json "barryvdh/laravel-ide-helper":"dev-master" 项目config/app.php Ba ...
- Windows Phone性能优化建议
使用background thread解码图片 在Windows Phone中支持的图片格式有jpg和png,微软建议使用jpg格式的图片,因为jpg格式的图片在解码速度上要比png快.那么我们怎么来 ...