|
楼主 |
发表于 2006-9-10 22:37:13
|
显示全部楼层
manphiz,我从图书馆里借来了C++ Templates回来啃,还是不太懂...正在啃+ing
另外,我试着把这个程序放到DevC++里编译不通过,在Visual C++ 6.0也不能通过.
我想问一个问题:Visual C++6.0好像不能很好地实现某些C++的标淮,是吗?
那么,DevC++呢?
因为我还是个Templates的初学者,很多东西都不太懂,希望见谅.
另外帮我看一下这个程序到底错在哪了..我也不太懂呢T_T
- #include <cstdlib>
- #include <iostream>
- #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
- #ifndef PROMOTION_HPP
- #define PROMOTION_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<>
- class Promotion<char, short> {
- public:
- typedef int ResultT;
- };
- template<>
- class Promotion<short, char> {
- public:
- typedef int ResultT;
- };
- template<typename T1, typename T2>
- Promotion<T1, T2>::ResultT max(T1 lhs, T2 rhs)
- {
- return lhs < rhs ? rhs : lhs;
- }
- using namespace std;
- int main(int argc, char *argv[])
- {
- int x = 1;
- double y = 0.5;
- cout<< max(x, y)<<endl;
- x = 3;
- y = 4.5;
- cout<< max(x, y)<<endl;
- system("PAUSE");
- return EXIT_SUCCESS;
- }
复制代码Post by manphiz
通常来讲,只有两个同类型的量才能做比较操作,即便是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
修改了几下,请见谅 |
|