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无限的可能. ...
随机推荐
- javascript插件uploadify简单实现文件上传
最近在学习mvc,需要用到文件上传的功能,找了很多的jquery插件,最后决定使用uploadify这个插件,参照了各位大神的博客,终于勉勉强强会用了.在此,做一下笔记,方便以后忘了查看. 首先在官网 ...
- ansible quick start
1. ansible默认开启ControlPersist,也就是持续化ssh的socket连接,以跳过每次task都需要进行主机认证. 2. 但是centos的openssh版本太老了,不支持Cont ...
- Mysql5.0以上 手工注入
Mysql5.0以上 order by 23 http://www..com/productdet.php?&id=89 and 1=2 UNION SELECT 1,2,3,4,5,6,7, ...
- 2016 - 1 - 22 HTTP(一)
一:通过URL找到服务器 1. URL的概念: 1.1 URL全称Uniform Resource Locatior 统一资源定位符 1.2 通过一个URL就可以找到互联网上的唯一的资源. 1.3 ...
- 学习:Log中'main', 'system', 'radio', 'events'
在Android中不同的log写到不同的设备中,共有/dev/log/system, /dev/log/main, /dev/log/radion, /dev/log/events四中类型.其中默认L ...
- 层次分析模型(AHP)及其MATLAB实现
今天用将近一天的时间学习了层次分析模型(AHP),主要参考了一份pdf,这个网站,和暨南大学章老师的课件,现写出一些自己总结的要点. 一.层次分析法的基本步骤: 角度一: 实际问题——分解——> ...
- show master status empty解决方案
The following MySQL error might occur if you are using MySQL replication and binary logs. mysql> ...
- 转:DateTime的灵活运用
//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...
- c++ 走向高级之日积月累
1.enum:http://en.cppreference.com/w/cpp/language/enum 2.weak_pr:http://en.cppreference.com/w/cpp/mem ...
- Java 父类和子类
package chapter11; public class GeometricObject1 { private String color="white"; private b ...