boost库: auto、any、tuple、variant

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 auto

auto是C++11中的关键字,它可以通过类型推导自动得到变量或对象的类型,需要注意的是auto会忽略引用,因为引用其实就代表原对象:

  • auto不能用于函数参数
  • auto不能用于非静态成员变量
  • auto仅能用于推导static const的整型或者枚举成员。 
  • auto无法定义数组
  • auto无法推导出模板参数
struct Foo
{
    auto var1_ = 0;
    static const auto var2_ = 0;
};
test.cpp:12:15: error: non-static data member declared ‘auto’  auto var1_ = 0;

使用场景:

  • 优化代码美观性,减少冗余和繁琐的重复操作
  • 无法提前感知函数返回类型的时候

any

any功能与auto类似,二者不同之处在于:auto是一个类似int、double、string的C++关键字,它不是一个类,所以没有成员函数可调用,直接把他当做int、double、string这种关键字来使用。any是一个类,只能通过any_cast<>获得any的实际内部值,而不能像auto定义的对象那样直接使用它。

any也可以用来存储任意类型元素,如int、double、string、vector或自定义类型。它能够存储任意类型的原因是其构造函数和赋值函数opeartor=是模板函数,可以接收任意类型。any不是一个模板类,所以定义元素的时候不必使用<>,如any a = 10;
  需要注意的有两点:
  在any存储字符串的时候只能使用string,如any a = string("hello");,不能使用C风格的字符串,如:any a = "hello";
  如果保存动态内存指针类型,会引起内存泄露,解决方法是使用智能指针shared_ptr来指向动态内存,如:shared_ptr ptrSmart(new char[10]); any a = ptrSmart; 

  any的出现让C++仿佛变成了一种弱类型的动态语言。
  动态语言:运行期间才做数据类型检查的语言,即编译的时候不知道每一个变量的类型,如php、Ruby
  静态语言:编译期间做数据类型检查的语言,即编译的时候就知道每一个变量的类型,如C/C++、C#、JAVA
  强类型:变量一定是有类型的, 且变量/对象的类型一旦确定, 其类型不再允许更改,如C/C++/Java/C#
  弱类型: 变量的类型概念很弱或者没有类型的概念, 不同变量的类型可以更改. 如php、Ruby
  类型安全:的代码不会试图访问自己没被授权的内存区域,如C/C++就不是类型安全的,两个不同类型的指针之间可以通过dynamic_cast进行转换。

 tuple

 tuple类型类似于std::pair,pair只支持包含两种类型的元素,tuple可以支持包含多个不同类型的元素,比如将其用于多个返回值的函数的话比使用struct更方便

boost::tuple func()
{
    int i = 1;
    double d = 5.0;
    string s("hello");
    boost::tuple tupleCombin(i, d, s);

    return tupleCombin;
}

 

variant

  variant是一种增强的union,C/C++中union只能持有POD(普通数据类型),而不能持有如string、vector等复杂类型,boost的variant则没有这个限制。

转载于:https://my.oschina.net/u/347414/blog/1935072

你可能感兴趣的:(c/c++,ruby,php)