TypeSelect based on TypeTraits

来源:互联网 发布:linux下nginx安装配置 编辑:程序博客网 时间:2024/05/01 03:18

根据所要操作的型别,选择合适的操作方法;所要解决的是:如何得到所要操作的型别。注意这里的意思并不是识别出所要操作的型别,而是根据具体所要进行的事务选择所要操作的型别单元。

这样的情况很多,比如说,在排序中,是要使用指针进行排序?还是使用原值进行排序?比如原class中有指针,或者多态,那么最好使用指针排序。否则也许使用原值排序更好。

 

那,我们的任务就是根据用户给出的一个bool(标志原class中是否有指针,或者多态),来选择在本次算法中所要操作的具体对象,是T?还是T*?

 

这里定义一个select模板,该模板用于确定该操作对象(根据用户给出的bool)。

其中,

template < typename type1, typename type2 >
struct select< false, type1, type2 >

是对模板的特化。接受bool为false。

 

最终的RealType即是所确定的所要操作的对象。

在某class中,我们这样使用之:

 

所取得的ValueType即该对象。实际上,正常情况下,我们在模板中都应该提供ValueType,只不过这里的ValueType有更特殊的意义。

 

在这样的语境中,需要用户自己给出bool,需要用户自己在类中写出取得ValueType的晦涩的代码,也暴露了我们的具体实现。(C++模板本是暴露的……)

用户能否不需给出bool,而让我们自己的程序去完成这样的判断?

 

貌似不可以……

虽然在SGI_STL有相似的实现--__type_traits,但SGI-STL只内置了基本类型的__type_traits,如果是用户自定义的type,则需要用户自定义__type_traits。这和让用户传递个bool并没有显著的不同。

 

也许可以写程序或模板,来判断class中是否存在指针或多态。不过这样的东东绝不是一个模板函数就能完成的了……

但理论上是可行的。

 

目前,利用TypeTraits,我可以做到:

如果语义是:

1,始终操作其对象值;即,如果该类型为T*,则操作T*;否则操作T;

2,始终操作T。即,如果类型是T*,则操作T,否则操作T。

 

对1:

 

在我们的class中,这样使用:

 

对第2,可以将上述代码稍作更改。

对1,2我们可以直接使用TypeTraits,或者新建模板TypeSlection将TypeTraits稍作包装。这样,用户就不再提供bool。

TypeTraits展示如下:

 

 

看起来,TypeSelect 的应用要比较广一些……

 

另要注意的是:在 typedef typename PointerTraits<type>::PinterType PointerType; 中,typename是不可少的。

 

更多参考:《C++设计新思维》

原创粉丝点击