美文网首页
现代c++笔记(1)

现代c++笔记(1)

作者: Teech | 来源:发表于2021-06-13 20:12 被阅读0次
variadic templates(数量不定的模板参数)
//递归定义
void printX() {} //递归终止条件
//接受任意个数任意类型参数
template<typename T,typename... Types>
void printX(const T& firstarg, const Types&... args)
{
  cout << firstarg << endl;
  //sizeof...(args) //查看pack的args的个数
  printX(args...);
})
 //泛化 上述特化,编译器优先选择特化版本
template<typename... Types>
void printX(const Types&... args)
{
  //...
}
//递归继承
template<typename Head,typename... Tail>
class Tuple<Head,Tail...>
  :private Tuple<Tail...>
  {
    protected:
      Head m_head;
  }
nullptr

c++11 使用nullptr替代NULL(0),主要是为了避免pointer和int歧义

void f(int); //fun1
void f(void*);//fun2
f(0);//call  fun1
f(NULL);    //编译不过歧义 vs2019可以编译过 call fun1
f(nullptr);//call fun2
auto

编译器可以自动推倒类型,主要方便简化代码或者避免写太复杂类型

auto a = 2.3;
double f();
auto b = f();
vector<string> v;
auto pos = v.begin();  
auto l = [](int x)->bool { //int 参数 返回bool l为一个lambda
  ...
}
Uniform initialization
//c++ 11之前的几种写法
Rect r1 = {3,7,20,25,&area,&print}
Rect r1(3,7,20,25);
int ia[6] = {3,7,20,25};
//由于c++之前多种初始化写法,所以c++引入一致性初始化 变量后直接都用大括弧
//{}下的东西 做出一个initializer_list<T>,关联一个array<T,n>
//如果构造函数中本身接受的参数为initializer_list<T>,那么直接可以传递这个参数过去
//否则编译器会依次拆分传递给构造函数
int values[]{1,2,3};
vector<int> v{1,2,3};
complex<double> c{2.3,3.4};
vector<string> vs{"aa","bb"};
initializer Lists
 //设置初始值
int a{};
int*p{};
//转换
int a(5.3);//double->int a=5
int a{5.0};//编译不通过 提示:double到int收缩转换 也可能给warning
int a= {5.0};//编译不通过
char c1{7};
char c1{9999};//编译不通过
//
void print(std::initializer_list<int> vals)
{
  for (auto i = vals.begin();i != vals.end();++i)
    cout<<*i<<endl;
}
print({2,4,7};)
class P{
  public:
    P(int a,int b)
    {
      cout<<"P(int a,int b)"<<a<<b<<endl;
    }
  //如果没有这个版本,编译器会自动拆分,调用到上述的版本
  //编译器首先会自动生成array,然后构造initializer_list,所以initializer_list中有个成员作为持有array的指针
    P(initializer_list<int> initlist){
      cout<<"initializer_list";
      for (auto p : initlist)
        cout<<p;
      cout<<endl;
    }
}
P p1(2,3);//call P(int a,int b)
P p2{2,3};//call initializer
P s = {2,3};//call initializer
array-作为initializer_list成员变量的指向
template <typename _Tp,std::size_t _Nm>
struct array {
  typedef _Tp value_type;
  typedef _Tp* pointer;
  typedef value_type* iterator;
  value_type _M_instance[_Nm ? _Nm:1];//如果传递0,默认长度给1
  iterator begin(){
    return iterator(&_M_instance[0]);
  }
  iterator end(){
    return iterator(&_M_instance[_Nm]);
  } 
}
标准库中使用initializer_list

标准库中大量使用initializer_list, 不仅仅是各种容器的构造函数,拷贝构造函数,以及赋值重载函数,甚至算法库也用到了

template<typename _Tp>
inline _Tp min(initializer_list<_Tp> _l){
  return *std::min_element(_l.begin(),_l.end());
}
//用法,这样可以不止传递两个参数作为min的参数了
cout<<min({1,3,5});

相关文章

  • 现代c++笔记(1)

    variadic templates(数量不定的模板参数) nullptr c++11 使用nullptr替代NU...

  • 现代c++笔记(4)

    可变参数模版 谈的模板包含类模板,函数模板 变化的是模板参数参数个数以及类型是变化的,通过逐渐递减参数个数来实现递...

  • 现代c++笔记(3)

    Alias Template temlate temlate parrameter type alias usin...

  • 现代c++笔记(2)

    Explicit 构造函数 避免隐式转换(不仅1个参数 ,多个参数一样) range based for =def...

  • C++学习笔记 day 1

    C++学习笔记 day 1 教学课程链接:bilibili 黑马程序员:C++从0到1入门编程[https://w...

  • C++模板库笔记

    C++标准模板库笔记(C++ Primer plus) 1.除序列外,vector还是可反转容器(reversib...

  • [163]1.1关于c++类声明的记录【GeekBand】

    //C++微专业 第一周笔记 //以下点多来自 《C++ Primer Plus 》第6版 1. C++程序组成 ...

  • C/C++与MATLAB混合编程

    C/C++与MATLAB混合编程笔记 1. 简介 C/C++和MATLAB之间的混合编程可以是:C/C++编程的过...

  • 2017-12-26

    C++面向对象程序设计 课程笔记(一) 一、C++编程简介 1.课程目标 以良好的方...

  • 深入探索C++对象模型

    一个博客,这个博客记录了他读这本书的笔记,总结得不错。《深度探索C++对象模型》笔记汇总 1. C++对象模型与内...

网友评论

      本文标题:现代c++笔记(1)

      本文链接:https://www.haomeiwen.com/subject/hhmgeltx.html