C++11的新特性
__func__
预定义标识符
__func__
的功能是返回所在函数的名字,如下:
1 | const char* Hello() {return __func__;} |
而且__func__
还可以被使用在类和结构体中,例如可以在类的构造函数中使用__func__
作为初始化成员列表的参数,如下:
1 | class TestClass{ |
_Pragma操作符
#Pragma
是一条预处理指令,例如我们可以在头文件中使用以下指令:
1 | #Pragma once |
熟悉C++的同学大概都知道,以上命令会告知编译器,当前的头文件只编译一次,等效于以下命令:
1 |
|
在C++11中,定义了与预处理指令#Pragma
功能相同的操作符 _Pragma。 _Pragma操作符格式如下所示:
1 | _Pragma(字符串字面量) |
例如:
1 | _Pragma("once"); |
模板函数,以及模板函数的默认模板参数
模板函数
函数也可以定义模板,如下:
1 | template<typename T> void printObject(T t){ |
执行结果:
1 | 1.5 |
在函数printObject中,我们定义了一个模板类型T,并且把它显示出来。编译器会根据输入的参数类型进行类型推断。
模板函数的默认模板参数
1 | template<typename T = double> void defaultPrintObject(T t = 0.5){ |
执行结果
1 | 0.5 |
在函数defaultPrintObject中,我们定义了默认的模板参数类型<typename T = double>
和默认值t = 0.5
。我们可以看到调用时,就算没有填入参数defaultPrintObject();
,编译器也可以根据默认值进行推断运行。
注意事项
模板函数的默认模板推断是从右到左的,例如:
1 | template<typename T1, typename T2 = int> class Test1; |
委托构造函数
decltype
decltype可以用来进行类型推倒,我的理解是这个原语有点像Java里面的类反射机制,接下来让我们看些代码: