二级考试C++基础(类型和值之间的映射)

二级考试C++基础(类型和值之间的映射),第1张

二级考试C++基础(类型和值之间的映射),第2张

在C++中,术语“转换”描述了从一种类型的值获取另一种类型的值的过程。但是有时候你需要一个不同类型的转换:可能是当你有一个类型的时候你需要得到一个值,或者其他类似的情况。在C++中做这种转换很不寻常,因为类型域和值域之间有严格的界限。但是,在一些特定的场合,你需要跨越这两个界限。本专栏将讨论如何做到这一点。
将整数映射到类型
一个对很多泛型编程风格非常有帮助的简单模板:
Template
struct int 2 type
{
enum { value = v };
};
对于传递的每个不同的常数值,Int2Type“产生”一个不同的类型。这是因为不同模板的实例化是不同的类型,所以Int2Type不同于Int2Type等其他类型。此外,生成的类型的值“存储”在enum的成员值中。
只要需要快速“键入”整数常量,就可以使用Int2Type。
问题描述:
当需要根据不同的值选择不同的行为时,常用的方式是使用if...其他...或者case结构
实现分支选择。在类型模板化函数的过程中,可能会出现问题。
看下面第一部分:
第一部分
下面的泛型容器NiftyContainer的元素类型被规范化为t,元素的赋值行为需要在容器中实现。非常规自定义类型,其复制行为复杂。特别是多态类型的复制过程不同于普通类型的复制过程。比如普通类型可以一点一点复制,而具有多态特征的类对象(比如指针成员)就不应该用这种方式复制。这里假设普通类型的复制使用复制构造函数,多态类型使用特殊的虚函数克隆进行复制。
#include
使用命名空间std
class Normal {
int _ I;
public:
Normal(){ _ I = 0;}
Normal(const Normal & nml){ _ I = nml。_ I;}
//省略其他成员
};
class Polym {
int * _ pi;
Polym(const Polym &);//禁止复制构造函数
void setp(int * I){ _ pi = I;}
public:
Polym(){ _ pi = 0;}
Polym * clone();
//省略其他成员
};
template
class nifty container
{
//省略其他成员
public:
void do something()
{
T * pSomeObj = new T;
if(is polymorphic)//branch 1
{
T * pNewObj = pSomeObj-> clone();//复制
//多态对象上某些操作的自定义行为
pNewObj = 0;
}
else//branch 2
{
T * pNewObj = new T(* pSomeObj);//使用copy-constructor
//对非多态对象的某些操作
delete pNewObj;
}
删除pSomeObj
}
//省略其他成员
};
int main(int argc,char* argv[])
{
//使用带有元素类型Normal的容器
nifty container NC;
nc。do something();//错误:class Normal没有成员函数clone
/使用带有元素的容器type polym
nifty container nc2;//错误:copy-Polym
nc2 . do something()类的构造函数private
system(" PAUSE ");
返回EXIT _ SUCCESS
}
错误解析
按照我们的预期,如果元素类型是多态的,那么只会执行branch1部分;否则,将只执行branch2部分,因为这两种类型的元素具有不同的复制功能。但是编译器不会关注这些,所有的都要编译,所以有错误。
对于模板,不同的参数意味着不同的类型。另外,模板的编译有一个特点,就是不用的模板函数不会参与编译,只会分析语法正确性。函数可以根据参数重载。
为了“根据常量(这里是isPolymorphic)的值只编译其中一个分支(例如branch1),而不编译其他分支,以保证最终的代码只包含需要的代码”,我们可以利用上面提到的模板编译特性和函数重载特性。
template
struct int 2 type {//创建此模板是为了生成具有不同常数值的不同类型
enum { value = v };
};
template
class nifty container
{
private:
void do something(T * pObj,int 2 type)//function _ p
{
T * pNewObj = pObj-> Clone();
//多态对象上的某些操作
pNewObj = 0;
}
void do something(T * pObj,int 2 type)//function _ n
{
T * pNewObj = new T(* pObj);
//对非多态对象
}
public的一些操作:
void do something(T * pObj)
{
do something(pObj,int 2 type());
}
//省略其他成员
};
int main(int argc,char* argv[])
{
//使用带有元素类型Normal的容器
nifty container NC;// ok
//使用包含类型为Polym的元素的容器
NiftyContainer nc2;//ok
system(" PAUSE ");
返回EXIT _ SUCCESS
}
编译过程中,编译器会根据传递的isPolymorphic template参数值选择实现哪个函数。如果为true,则在不尝试编译function _ n的情况下实现function_p..这样就成功实现了编译时多态,而不是执行时多态。
这项技术的关键点是Int2Type模板。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 二级考试C++基础(类型和值之间的映射)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情