所在的位置: c++ >> 编程思想 >> C11新特性如何利用C

C11新特性如何利用C

decltype

decltype是C++11中加入的一个小的新特性,可以从表达式中获得定义的类型。简单的说

intx=10;

decltype(x)y=10;//y--int

constinttest_func(void);

decltype(test_func)a=x;//a--constint

decltype一般用在泛型中,不用再精确定义泛型,比如在C++98/03中一般会这样定义vectorint。

举一个简单的例子,如果使用传统的做法这个模板类只能接收非const的容器,但是使用了decltype后,就没有这样的问题。

#includeiostream

#includevector

templateclassContainerT

classTest

{

decltype(ContainerT().begin())it_;//在C++11以前,一般都用用typenameContainerT::iteratorit_;

public:

voidfunc(ContainerTcontainer)

{

it_=container.begin();

std::cout*it_std::endl;

}

};

usingnamespacestd;

intmain(){

//noconsttype

typedefstd::vectorintcontainer_t;

container_tarr(10,10);

Testcontainer_ttest;

test.func(arr);

//consttype

typedefconststd::vectorintconst_container_t;

container_tconst_arr(10,20);

Testconst_container_tconst_test;

const_test.func(const_arr);

return0;

}

auto

C++11中auto可以自动推断出当前变量的类型,这个功能有点类似于decltype,但又不同。下面有一些实例

autoa=5;//a--int

autob;//error,部分推断出是什么变量

intc[10]={0};

autod[10]=c;///error,不能用于数组

voidfunc(autox=1){};//error,不能用于函数参数

vectorinte;

vectorautof=e;//error,不能用于参数模板

我的建议是auto只用在意义明确,同时是为了避免冗长的重复表达式的地方,其他地方一概不要用。

intmain()

{

std::mapint,inttestMap;

for(autoit=testMap.begin();it!=testMap.end();++it)//避免了这样的定义std::mapint,int::iteratorit

{

}

}

trailing-return-type

这是一个非常有意思的用法,能非常简洁的实现很多有用的小功能。如下面的例子,这类语法可以直接跟踪模板函数add的返回类型是什么。

templatetypenameT1,typenameT2

autoadd(T1t1,T2t2)-decltype(t1+t2)

{

returnt1+t2;

}

intmain()

{

inttestresult=add(12,13);

couttestresultendl;

}

using

using可以完全替代typedef,这是非常大的福音。typedef的定义来源于C时代,定义一个复杂的别名的时候,有一定的预读困难。using比较符合人的习惯,而且更加简洁。强烈推荐使用。

usingmap_test=std::mapdouble,int

usingfunc_test=void(*)(int,int)

默认模板参数

C++11

templatetypenameT1=int,typenameT2

T1func(T2val)









































白癜风医院哪家好
北京白癜风专科治疗医院



转载请注明:http://www.nydjfy.com/bcxx/916.html