C++设计新思维泛型编程与设计模式之应用(型别选择)

本文探讨了C++中NitifyContainer类的两种不同实现方式,对比了它们在处理多态类型时的区别,并分析了各自的优势与局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了描述问题,根据《 C++设计新思维泛型编程与设计模式之应用》的2.6节的例子中,NitifyContainer中有一个数据结构用来存储类型T的实现,但是这个类型T有可能是多态的,在多态的情况下,存储指针,反之存储对象(你也可以不用这么做,这里只是为了描述这个问题),好了。《 C++设计新思维泛型编程与设计模式之应用》书中给出了第一种解决方案,代码如下所示:

template<class T, bool isPolyMorphic>
struct NitifyContainerValueTrait {
    typedef T *ValueType;
};

template<class T>
struct NitifyContainerValueTrait<T, false> {
    typedef T ValueType;
};

template<class T, bool isPolyMorphic>
class NitifyContainer {
    typedef NitifyContainerValueTrait<T, isPolyMorphic>::ValueType ValueType;
};

这里通过bool型参数isPolyMorphic来决定ValueType的类型。

书中还提供了另外一种写法,如下

template <bool  isPolyMorphic,typename T,typename  U>  struct Select{
    typedef T Result;
};

template <typename T,typename  U>  struct Select<false,T,U>{
    typedef U Result;
};

template<bool isPolyMorphic,typename T, typename U>
class NitifyContainer {
    typedef typename Select<isPolyMorphic,T,U>::Result ValueType;
};

仔细看一下这两种解决方式,初看之下,啥区别都没有,对吧?对头,没错,我也没看出啥。

但是仔细分析一下,第二种写法直接导致了Result的类型取决于模板参数的类型,因此类型的种类多少,无关紧要。而第一种不是,第一种的写法导致类型的定义是有限制的,因为你永远不知道,模板参数T传递的到底是啥??所以 typedef T ValueType就存在着很大的限制,当然了,这个只是我个人的理解。

根据原书的解答,实在是不知所云,哈哈


各种原有,也只有读者自行领会了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值