C++11的新特性

__func__ 预定义标识符

__func__ 的功能是返回所在函数的名字,如下:

1
2
const char* Hello() {return __func__;}
const char* World() {return __func__;}

而且__func__还可以被使用在类和结构体中,例如可以在类的构造函数中使用__func__作为初始化成员列表的参数,如下:

1
2
3
4
5
6
7
8
class TestClass{     
private:
const char* name;
public:
TestClass():name(__func__){}
const char* getName(){ return name; }
};
}

_Pragma操作符

#Pragma是一条预处理指令,例如我们可以在头文件中使用以下指令:

1
#Pragma once

熟悉C++的同学大概都知道,以上命令会告知编译器,当前的头文件只编译一次,等效于以下命令:

1
2
3
4
#ifdefine HEADER
#define HEADER
//具体的头文件定义实现
#endif

在C++11中,定义了与预处理指令#Pragma功能相同的操作符 _Pragma。 _Pragma操作符格式如下所示:

1
_Pragma(字符串字面量)

例如:

1
_Pragma("once");

模板函数,以及模板函数的默认模板参数

模板函数

函数也可以定义模板,如下:

1
2
3
4
5
6
7
template<typename T> void printObject(T t){
std::cout << t << std::endl;
}
int main(int argc, const char * argv[]) {
printObject(1.5);
printObject("1.7");
}

执行结果:

1
2
1.5
1.7

在函数printObject中,我们定义了一个模板类型T,并且把它显示出来。编译器会根据输入的参数类型进行类型推断。

模板函数的默认模板参数

1
2
3
4
5
6
7
template<typename T = double> void defaultPrintObject(T t = 0.5){
std::cout << t << std::endl;
}
int main(int argc, const char * argv[]) {
defaultPrintObject();
defaultPrintObject(1);
}

执行结果

1
2
0.5
1

在函数defaultPrintObject中,我们定义了默认的模板参数类型<typename T = double>和默认值t = 0.5。我们可以看到调用时,就算没有填入参数defaultPrintObject();,编译器也可以根据默认值进行推断运行。

注意事项

模板函数的默认模板推断是从右到左的,例如:

1
2
template<typename T1, typename T2 = int> class Test1;
template<typename T1 = int, typename T2 > class Test2;//不能通过编译

委托构造函数

decltype

decltype可以用来进行类型推倒,我的理解是这个原语有点像Java里面的类反射机制,接下来让我们看些代码:

lambda函数

样例代码链接

参考文献