C++的那些事 1


最近在看c++的一些库文件,里面的一些比较陌生但看起来挺有用的一些东西,在此记下,以避免往后看到再翻找资料。
c++

template <size_t _Nb>

这是在看bitset的时候看到的,以前用bitset的时候也没太留意,这是才发现bitset的类模板参数不是一个类型,而是一个数,这才发现原来类模板参数也能够是一个数。数组

C++ Primer的654页提到了Nontype Template Parameters就是指这个,来看一下他给的例子。函数

template <unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
    return strcmp(p1, p2);
}

当咱们调用优化

compare("hi", "mom");

至关因而调用了指针

int compare(const char (&p1)[3], const char (&p2)[4])

也就是说Nontype Template Parameters跟咱们日常所用的模板实际上是相似的,只不过日常所用的模板参数是数据类型,而这个是数,bitset就是用这个来声明bitset的位数。
这时,若是类中的一个常量成员与模板参数有关,那么这个常量成员要设为静态常量,由于对于同一个实例模板,这个成员是静态的(不随新建对象而改变)。rest

Conversion Operator(类型转换运算符)

operator type() const;

这是一个特殊的类成员函数,它的做用是将类转化为类型为type的值,例如operator bool() const;就是将类转化为bool,当类对象须要转化为type类型时,该函数就会被调用,与其它运算符函数不一样的是,这个函数能够直接调用,例如b.operator A()就是调用b对象的类型转换运算符A。code

array

咱们常常用new[]来新建一个数组,但这样很容易出错,若是不当心把头指针弄丢了,那么整个数组就没了,并且新建出来的内存也会浪费掉,因此C++11新添加了一个array的数据新型,新建之后就当数组用就是了,并且与数组同样,它的内存存储是连续的。对象

Rvalue Reference(右值引用)

bitset::insert(const_iterator position, value_type&& val)

上面代码中的value_type&& val就是右值引用的一个例子,在C++ Primer的532页有关于Rvalue Reference的介绍,这个的主要使用是在对象要被释放以前将对象的资源(内容)移出来,而不是进行复制操做,就像原文所说的:
Rvalue reference refer to objects that are about to be destroyed. Hence, we can "steal" state from an object bound to an rvalue reference.
在日常的使用中可能没有感觉到右值引用带来的好处,特别是对"steal"如何理解,我以为知乎上Tinro的回答中对"steal"的解释挺详细的,经过右值引用这个概念能够进行不少优化。内存

Variadic Template

在看到这个的时候,我特别开心,由于我知道Matlab是有这个功能的,之前觉得C++没有这个功能,以为怪惋惜的,如今发现能够这样用,并且与tuple配合使用能够产生许多好用的功能,举个例子(C++ Primer第700页)element

template <typename T, typename... Args>
void foo(const T &t, const Args&... rest);

这就是一个可变参数模板,其中Args是一个模板参数包,rest是一个函数参数包,所以foo函数的参数只要大于一个就行,下面是一些调用的例子

int i=0; double d=3.14; string s="variadic";
foo(i, s, 42, d);    //包中有三个参数
foo(s, 42, "hi");   //包中有两个参数
foo(d, s);            //包中有一个参数
foo("hi");            //包中没有参数

若是对rest进行取地址的处理,那么获得的会是rest里面全部变量都取地址,用cout输出时,只需cout << rest便可按顺序输出参数。
但若是要对参数进行运算,就要用到tuple这一数据类型,tuple的每一个变量的类型均可以不同,支持取某个变量的类型,取值等操做,这样只要把用(Args, rest)新建一个tuple,就能够对里面的值进行修改。下面是tuple的例子

tuple< string, vector<double>, int, list<int> > someVal("constants", {3.14, 2.718}, 42, {0,1, 2, 3, 4, 5});
typedef decltype(someVal) trans;    //trans: <string, vector<double>, int, list<int> >
tuple_element<2, trans>::type cnt=get<2>(someVal);   
 //tuple_element<2, trans>::type :取trans中的第2个类型,get<1>(someVal) :取someVal中的第2个数。
//因此cnt的类型为int, 数值为42
相关文章
相关标签/搜索