一、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++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别的更多相关文章

  1. C++函数的返回值——返回引用类型&非引用类型

    函数的返回主要分为以下几种情况: 1.主函数main的返回值: 允许主函数main没有返回值就可结束:可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败. 2 ...

  2. C++解析(27):数组、智能指针与单例类模板

    0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3 ...

  3. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  4. php7函数,声明,返回值等新特性介绍

    使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. functi ...

  5. c++-内联函数和函数重载和默认参数和函数指针

    内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编 ...

  6. Go基础:函数多返回值特性

    之前在写Python程序的时候,惊叹于它支持多返回值的特性带来的便利性.在学习Go的时候,发现Go也拥有多返回值的特性. 1.基本用法 创建一个多返回值的方法: func getACar() (bra ...

  7. (原)C++解析XML生成类对象_v1.0 函数指针

    要写一个xml解析,解析后获得到的数据变成各个类的对象. 解析有现成的库,使用tinyxml,但是解析出来的类库如何变成各个类的对象, 例如一下这个xml, <musics> <mu ...

  8. 成员函数指针与高效C++委托 (delegate)

    下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...

  9. block与函数指针有什么区别

    block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传递参数.同时block本身也可以被作为参数在方法和函数间传递,这就给予了block无限的可能. ...

随机推荐

  1. python常见错误总结

    TypeError: 'module' object is not callable 模块未正确导入,层级关系没找对 缩进错误. IndentationError: unindent does not ...

  2. jQuery 自定义扩展,与$冲突处理

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 如何使用 PagedList.Mvc 分页

    刚开始找PagedList分页不是例子太复杂,就是写的过于简略,由于对于MVC的分页不太了解,之前使用的都是Asp.Net 第三方控件 + 数据库存储过程分页.还是老外写的例子简捷,https://g ...

  4. HTML基础学习笔记

    一.基本结构 <html>——开始标记 <head></head>——头标记,用来控制布局.编码.特效等内容 <body></body>—— ...

  5. poj1014 dp 多重背包

    //Accepted 624 KB 16 ms //dp 背包 多重背包 #include <cstdio> #include <cstring> #include <i ...

  6. Tomcat容器运行struts2+spring+mybatis架构的java web应用程序简单分析

    1.具体的环境为 MyEclipse 8.5以及自带的tomcat spring3.0.5 struts2.3.15.1 mybatis3.0.5 2.想弄明白的一些问题 tomcat集成spring ...

  7. Discuz 插件制作之后台常用函数详解

    目录 showsetting()表单显示 cpmsg()提示消息 showformheader()创建表单头 showformfooter()创建表单尾 showtableheader()创建表格头 ...

  8. python构建模拟模型——网站独立访问用户数量

    背景:发现一个有趣的现象,即一些用户在每一月都仅仅访问网站一次,我们想要了解这些人数量的变化趋势. 建立数学模型:简化问题,根据瓮模型推导出公式(具体推导见<数据之魅>,有时间再补充... ...

  9. susy 学习之进阶

    由于现在对susy的教程有限,只有官网指南性质的文档,然后就是w3cplus对她的翻译,所以我从零安装susy并调试项目到与从github上克隆susy项目同时进行,主要是为了参考susy放在git上 ...

  10. 【LEETCODE OJ】Candy

    Problem link: http://oj.leetcode.com/problems/candy/ Suppose we are given an array R[1..N] that are ...