What are you,Anyway?[VC/C++编程]
本文“What are you,Anyway?[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在经过艰难的谈论template metaprogramming很长时间后,返回到我们学习的开始.
在这一部份,我们来理解模板编程的更为模糊的语法问题:在编译器没有充分的信息的情形下,怎样指导编译器举行解析.在这里,我们将谈论尺度容器顶用来消除歧义的“rebind”机制.同时,我们也将对一些潜在的模板编程技术举行热烈的谈论.
乃至经验丰富的C++程序员,也常常被模板的复杂的语法所困扰.在所以模板语法中,我们首先要理解:消除编译器解析的歧义,是最基本的语法困惑.
Types of Names, Names of Types
让我们看看一个没有实现尺度容器的模板例子,这个例子很简单.
template <typename T>
class PtrList {
public:
//...
typedef T *ElemT;
void insert( ElemT );
private:
//...
};
常常模板类嵌入Type names信息,这样,我们便可以通过精确的nested name 得到实例化的模板信息.
typedef PtrList<State> StateList;
//...
StateList::ElemT currentState = 0;
嵌入范例的ElenT答应我们可以,很简单的拜候PtrList模板的所承认的元素范例.
即便我们用State范例初始化PtrList,元素范例还将是State*.在其他一些情形下,PtrList 可以用指针元素实现.一个对比成熟的PtrList的实现,应当是可以随着初始化的元素范例而改变的.利用nested type,可以帮忙我们封装PtrList,免得用户理解内部的实现.
下面还有一个例子:
template <typename Etype>
class SCollection {
public:
//...
typedef Etype ElemT;
void insert( const Etype & );
private:
//...
};
SCollection的实现跟PtrList一样,服从尺度命名的条款.服从这些条款是有效的,这样我们便可以写出很多文雅的算法来利用这些容器(译注:像尺度模板库一样).比方:可以写一个以下的算法:用得当的元素范例来填充这个容器数组.
template <class Cont>
void fill( Cont &c, Cont::ElemT a[], int len ) { // error!
for( int i = 0; i < len; ++i )
c.insert( a[i] );
}
以上是“What are you,Anyway?[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |