型别选择
Ø 需求:
有时候,泛型程序需要根据一个boolean变量来选择某个型别或另一型别。
Ø 例:
如果你想写一个泛型容器NiftyContainer,你也许会以一个std::vector作为后端存储结构。面对polymorphic(多态)型别,必须存储其指针;面对non-polymorphic(非多态)型别,可以存储其实体,以提高访问效率。在你的class template中:
template
class NiftyContainer
{
…
};
根本而言,你需要根据isPolymorphic来决定将ValueType定义为T*或T。
Ø 解决方法:
1) 使用traits class template技巧:
template
struct NiftyContainerValueTraits
{
typedef T* ValueType;
};
template
struct NiftyContainerValueTraits
{
typedef T ValueType;
};
template
class NiftyContainer
{
…
typedef NiftyContainerValueTraits Traits;
typedef typename Traits::ValueType ValueType;
};
该方法缺点:笨拙难用,无法扩充。这个traits class template只适用于型别T和T*之间的选择,对与其它不同的型别的选择,你都必须定义出专属的traits class template。
2) Loki库的Select class template(采用模板偏特化机制)
template
struct Select
{
typedef T Result;
};
template< typename T,typename U>
struct Select
{
typedef U Result;
};
现在就可以方便的定义NiftyContainer::ValueType了:
template
class NiftyContainer
{
…
typedef Select< isPolymorphic ,T*,T>::Result ValueType;
};
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17014649/viewspace-612376/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17014649/viewspace-612376/