C++11/14新特性综述整理

文章目录

  • C++11/14
    • (可变参数模板)variadic templates
      • 递归的调用
      • 递归的继承
      • 递归的复合
    • Spaces in Template Expressions
    • 右值引用
      • std::move()与std::forward()
      • 写一个能支持右值引用的MyString
    • auto 与 decltype
      • auto
      • decltype
    • nullptr 与 std::nullptr_t
    • for的遍历功能
    • for_each
    • override 与 final
    • “=default” 、“=delete”
    • 初始化列表
    • explicit 关键字
    • 模板别名(Alias Template)与类型别名(Type Alias)
      • Alias Template
      • Type Alias
      • using的其它用法
    • noexcept
    • 智能指针shared_ptr,unique_ptr,weak_ptr
    • 构造函数的相互调用
    • 字符串字面量
    • lambda
    • 强枚举类型
      • 强枚举的巧妙应用
    • chrono
  • 新的容器
    • array
    • hashtable
    • unordered容器
      • hash function
    • tuple
  • 参考文章

C++11/14

(可变参数模板)variadic templates

这个特性在C++11/14中算是一个重量级别的新特性,看一下简单的使用方法,
关键字为 “…” 就是所谓的一个包

递归的调用

  • 利用参数个数逐一递减的特性,完成一个简单的递归。
void print(){
    
}

template <typename T, typename... Types>			//模板参数包
void print(const T& firstArg,const Type&... args){
   	//函数参数类型包
	cout<< firstArg << endl;
	cout<<sizeof...(args)<<endl;					//输出参数个数
	print(args...);									//函数参数包
}
  • 实现比较一系列数字大小的max
 int maximum(int n)
 {
   
 	return;
 }
 template<typename...Args>
 int maximum(int n,Args...args)
 {
   
 	return std::max(n,maximum(args...));
 }

现在max也支持初始化列表(initializer_list)

递归的继承

  • tuple的原理就是使用这个完成的。简易版的tuple
template<typename... Values>class tuple;
template<>class tuple<>{
   };
template<typename Head,typename... Tail>
class tuple<Head,Tail...>:private tuple<Tail...>
{
   
	typedef tuple<Tail...> inherited;
protected:
	Head m_head; 
public:
	tuple(){
   }
	tuple(Head v,Tail... vtail):m_head(v),inherited(vtail...){
   }
	//Head head(){return m_head;}
	auto head()->decltype(m_head){
   return m_head};
	inherited& tail(){
   return *this;}
};

递归的复合

template<typename... Values>class tup;
template<>class tup<>{
   };
template<typename Head,typename... Tail>
class tup<Head,Tail...>
{
   
	typedef tup<Tail...> composited;
protected:
	Head m_head;
	composited m_tail;
public:
	tup(){
   }
	tup(Head v,Tail... vtail):m_head(v),composited (vtail...){
   }
	
	Head head(){
   return m_head;}
	composited& tail(){
   return m_tail;}
};

Spaces in Template Expressions

在模板表达式中嵌套模板一定要用一个空格隔开,不过从C++11开始能够很好的支持了。

vector<list<int> >;
vector<list<int>>;	//OK since C++11

右值引用

主要作用临时对象非必要的昂贵的拷贝操作,第二个问题是在模板函数中如何按照参数的实际类型进行转发。可以参考
从4行代码看右值引用

主要理解,左值,将亡值,纯右值

  • 左值:所有的具名变量或对象都是左值
  • 将亡值:C++11新增的、与右值引用相关的表达式,比如,将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值等
  • 纯右值:非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和lambda表达式等都是纯右值

注意点二:右值引用不接受左值作为参数。

std::move()与std::forward()

std::move()能够将左值转换成右值,一般用于拷贝左值时,被拷贝的左值不再使用时,能够直接获取左值的资源,提高拷贝效率,std::forward()能够完美的传递参数不丢失任何性质。

写一个能支持右值引用的MyString

class MyString{
   
<

你可能感兴趣的:(C++,c++,开发语言,后端)