c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别
一、c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针
格式如下:
class A
{
public:
void func(){printf("This is a function!\n");}
int data;
};
void (A::*p)()=&A::func;//带有取址符号,普通函数指针不带该符号,可能防止编译歧义,和traits机制中typename作用类似
int A::*q=&A::data;
p();//error:非静态成员函数的使用必须依附于对象
A a;
a.data=1;
(a.*p)();//output:This a function!
cout<<a.*q<<endl//output:1
二、非类型类模板参数:
template <class T,int inst>
struct B
{
T t;
int fun(){cout<<inst<<endl;}
}
B<int,10> b;
b.fun();//output:10
三、函数指针返回值:
void (*fun(void(*f)()))(){}
黑色部分形成了一个函数指针的形式,红色部分函数名,绿色部分是与之对应的参数列表,函数指针类型与函数结合形成了一个函数定义的形式,当然也可用typedef简化形式
四、内嵌型别示例:
template <class T,int inst>
struct C
{
T t;
template <class U>
void fun(){cout<<"a nested class"<<endl;};
void fun(){cout<<inst<<endl;}
class M;
};
template <class T,int inst>
class C<T,inst>::M
{
int a;
};
main:
C<int,10> c;
c.fun<int>();//output:a nested class
五、模板参数推导机制和内嵌型别的作用:
template <class T>
void fun(T a){cout<<a<<endl;}
fun(10);//自动设T为int类型
下面一种情况,推导机制无法满足需要
template <class T,class U>
U fun(T a){cout<<a<<endl;return (U)a;}
为了泛化算法,c++引入了迭代器(或者叫做智能指针),算法以迭代器做参数的时候可能会用到迭代器所指向的实际类型,这就需要迭代器携带有他所指向的类型的信息),这就实现了类型信息的传递。
实际上参数推导机制和关联型别都是编译时期的策略,都是为了得出算法中用到的型别,为了配合编译器的工作所增加的语言特性
对于泛化算法而言,通常在实例化的时候并不指定模板参数,这时就要用到参数推导了,但是迭代器作为算法的参数时,如果要用到迭代器的关联型别,这时参数推导并不能得出该关联型别,所以迭代器必须自己携带相关联型别(类自身通过typedef T value_type这样一句来使自己携带自身的类型),否则算法不能进行型别相关的动作。
实际上,stl中只要不指定模板参数,基本上都会先进行参数推导,得到迭代器的型别,再通过traits机制获取迭代器相关型别
这里还要说一下类模板的偏特化,当然是对同一个类来说的,比如对一个类 class C 它的偏特化版本需要对模板参数进行限定(加上一层条件)比如class C<T*>模板参数需要是T*类型才可以通过这个偏特化模板进行实例化。
综上,当人们想要实现自己的某一理念的时候,往往会伴随着开辟新的语法特性来满足这种需求。
references:
http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/k8336763(v=vs.71).aspx
http://bbs.csdn.net/topics/380042439
http://developer.51cto.com/art/201002/183057.htm
c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别的更多相关文章
- C++函数的返回值——返回引用类型&非引用类型
函数的返回主要分为以下几种情况: 1.主函数main的返回值: 允许主函数main没有返回值就可结束:可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败. 2 ...
- C++解析(27):数组、智能指针与单例类模板
0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3 ...
- day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- php7函数,声明,返回值等新特性介绍
使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. functi ...
- c++-内联函数和函数重载和默认参数和函数指针
内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编 ...
- Go基础:函数多返回值特性
之前在写Python程序的时候,惊叹于它支持多返回值的特性带来的便利性.在学习Go的时候,发现Go也拥有多返回值的特性. 1.基本用法 创建一个多返回值的方法: func getACar() (bra ...
- (原)C++解析XML生成类对象_v1.0 函数指针
要写一个xml解析,解析后获得到的数据变成各个类的对象. 解析有现成的库,使用tinyxml,但是解析出来的类库如何变成各个类的对象, 例如一下这个xml, <musics> <mu ...
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
- block与函数指针有什么区别
block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传递参数.同时block本身也可以被作为参数在方法和函数间传递,这就给予了block无限的可能. ...
随机推荐
- Nginx SSL配置过程
1. 在godaddy购买了UCC SSL(最多5个域名)的SSL证书 2. 设置证书 -- 管理 -- 3. 需要制作证书申请CSR文件(在线工具制作或者openssl命令制作),保存CSR和key ...
- 2013年9月份第1周51Aspx源码发布详情
大型B2B家具门户网源码 2013-9-6 [VS2008]功能描述: 1.门户信息管理 安全取数据即使数据库连接中断不会报错 2.稳定性 每句代码经过3次以上检查.此网站还在运营3年了,没有出过问 ...
- 2016-1-10 手势解锁demo的实现
一:实现自定义view,在.h,.m文件中代码如下: #import <UIKit/UIKit.h> @class ZLLockView; @protocol ZLLockViewDele ...
- 12-27cell常用的属性
1.创建cell // 创建一个cell并且设置cell的风格 UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UI ...
- 深入分析:Fragment与Activity交互的几种方式(一,使用Handler)
这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...
- IOS 作业项目(4)步步完成 画图 程序(中续)
一,程序布局整理 前言://1,程序启动//2,程序流程框架//3,程序界面一致//4,程序界面功能, //这里只做页面的固定功能, //在首次创建界面时,我们会指定好固定事件触发前的固定方法 //至 ...
- C#基础指针类型
在C#的不安全的代码书写中,类型可以是指针类型.值类型或引用类型. 指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed bu ...
- Unity3D ShaderLab 基础的高光实现
Unity3D ShaderLab 基础的高光实现 关于高光: 在一个物体表面的高光属性就是为了描述它是如何表现光泽.这种类型的效果在着色器的世界中通常称为视点相关效果. 之所以这样说,是因为为了实现 ...
- 微信公众平台 验证URL及简单设置
加密/校验流程如下: 1. 将token.timestamp.nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signatu ...
- 暴力枚举——Help Me with the Game
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3394 Accepted: 2172 Description You ...