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)
白癜风医院哪家好北京白癜风专科治疗医院