一、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. SpringMvc异常

    局部异常:在controller内部写一个处理异常的方法,注解ExceptionHandler(value={自己弄的异常class}) 这样发生value里面的类的异常,就可以执行这个方法,然后往r ...

  2. 转:Java面试题集(1-50)

    Java程序员面试题集(1-50) http://blog.csdn.net/jackfrued/article/details/17403101 一.Java基础部分 1.面向对象的特征有哪些方面? ...

  3. table td的宽度详解

    前言:一直总觉得td的宽度好难驾驭,但万事万物总是有规律的.就像亮剑说的:不用因为怕八路就敬而远之,应该靠上去,熟悉他们,了解他们.   正文:           Table只有Table的宽度是可 ...

  4. 不能使用weak修饰进行声明的类

    These classes include NSTextView, NSFont and NSColorSpace; for the full list, see Transitioning to A ...

  5. BZOJ 3687 简单题

    bitset维护某个和是否存在. bit<<x:所有子集的和+x. #include<iostream> #include<cstdio> #include< ...

  6. UVA1476 三分法

    单峰函数(即先递增后递减,有极大值的函数),都可以用三分法来求 #include <iostream> #include <cmath> #include <cstdio ...

  7. HDU 4054

    http://acm.hdu.edu.cn/showproblem.php?pid=4054 模拟题,对一个字符串的每个字符输出16进制表示的数字,每行处理16个字符,后面再把这16个字符输出,大小写 ...

  8. 解决spring配置中的bean类型的问题:BeanNotOfRequiredTypeException

    解决spring配置中的bean类型的问题:BeanNotOfRequiredTypeException这个问题出现的原因:一般在使用annotation的方式注入spring的bean 出现的,具体 ...

  9. Nginx工作原理和优化

    转自:http://blog.csdn.net/hguisu/article/details/8930668 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过 ...

  10. phpcms站---去除域名绑定目录中的HTML

    原网址:http://www.xker.com/page/e2014/1207/148536.html 打开 \install_package 打开 \caches\configs 目录下的 syst ...