|
发表于 2006-9-6 23:54:30
|
显示全部楼层
通常来讲,只有两个同类型的量才能做比较操作,即便是short->int甚至int->double,type promotion也可以保证不需要对两个量分别定义类型。
具体到问题本身,有两个方法:
1、使用指定的返回参数:- template<typename RT, typename T1, typename T2>
- RT max(T1 lhs, T2 rhs)
- {
- return lhs < rhs ? rhs : lhs;
- }
复制代码 而在使用中使用下面比较笨拙的方法。
2、采用模板元编程技巧的promotion trait。
首先设计一个IfThenElse模板:- // ifthenelse.hpp
- #ifndef IFTHENELSE_HPP
- #define IFTHENELSE_HPP
- template<bool C, typename T1, typename T2>
- class IfThenElse;
- template<typename T1, typename T2>
- class IfThenElse<true, T1, T2> {
- public:
- typedef T1 ResultT;
- };
- template<typename T1, typename T2>
- class IfThenElse<false, T1, T2> {
- public:
- typedef T2 ResultT;
- };
- #endif
复制代码
然后设计promotion trait:- // promotion.hpp
- #ifndef PROMOTION_HPP
- #define PROMOTION_HPP
- #include <ifthenelse.hpp>
- template<typename Ta, typename Tb>
- class Promotion {
- public:
- typedef typename IfThenElse<(sizeof(Ta))>(sizeof(Tb)),
- Ta,
- typename IfTheElse<(sizeof(Ta))<(sizeof(Tb)),
- Tb,
- void
- >::ResultT
- >::ResultT ResultT;
- };
- template<>
- class Promotion<T,T> {
- public:
- typedef T ResultT;
- }
- #endif
复制代码 这样基本可以满足类型推广的需要。这样使用:- template<typename T1, typename T2>
- Promotion<T1, T2>::ResultT max(T1 lhs, T2 rhs)
- {
- return lhs < rhs ? rhs : lhs;
- }
复制代码 值得注意的在整型类型的类型推广时不满足标准的规定。比如char,short->int。如果需要的话,需要创建模板特化,例如- template<>
- class Promotion<char, short> {
- public:
- typedef int ResultT;
- };
- template<>
- class Promotion<short, char> {
- public:
- typedef int ResultT;
- };
复制代码 依此类推。
参考
C++ Templates: The Complete Guide, David Vandevoorde, Nicolai M. Josuttis
修改了几下,请见谅 |
|