重载运算符之应用: 支持C式结构的一些运算
本文以系统的struct timeval为例,使其支持+、-、+=、-=4种算术运算和<,<=,>,>=,==、!= 6种关系运算,这样一来就免去了显式调用函数的麻烦,使代码简洁优雅,实现如下
由于timeval_t公有继承timeval,因此上述10种运算也支持timeval_t类型,而算术运算的内部实现保证了运算结果timeval对象是有效的,即其成员变量tv_usec取值在[0,1000000)区间,这是通过timeval_normalize函数实现的,代码如下
最后来看下使用示例
可以看到将运算符用到C式结构上,大大简化了代码的编写。以上所有代码在vc2005和g++4.4下编译通过。
1
extern void timeval_normalize(timeval &t);
2![]()
3
class timeval_t : public ::timeval
4
{
5
public:
6
timeval_t(long sec = 0,long usec = 0)
7
{
8
tv_sec = sec, tv_usec = usec;
9
timeval_normalize(*this);
10
}
11
12
timeval_t(const timeval& t)
13
{
14
if (this != &t){
15
tv_sec = t.tv_sec, tv_usec = t.tv_usec;
16
timeval_normalize(*this);
17
}
18
}
19
20
timeval_t& operator = (const timeval &t)
21
{
22
if (this != &t){
23
tv_sec = t.tv_sec, tv_usec = t.tv_usec;
24
timeval_normalize(*this);
25
}
26
return *this;
27
}
28
};
29![]()
30
inline void operator += (timeval &t1,const timeval &t2)
31
{
32
t1.tv_sec += t2.tv_sec,t1.tv_usec += t2.tv_usec;
33
timeval_normalize(t1);
34
}
35![]()
36
inline void operator -= (timeval &t1,const timeval &t2)
37
{
38
t1.tv_sec -= t2.tv_sec, t1.tv_usec -= t2.tv_usec;
39
timeval_normalize(t1);
40
}
41![]()
42
inline timeval operator + (const timeval &t1,const timeval &t2)
43
{
44
return timeval_t(t1.tv_sec+t2.tv_sec,t1.tv_usec+t2.tv_usec);
45
}
46![]()
47
inline timeval operator - (const timeval &t1,const timeval &t2)
48
{
49
return timeval_t(t1.tv_sec-t2.tv_sec,t1.tv_usec-t2.tv_usec);
50
}
51![]()
52
inline bool operator == (const timeval &t1,const timeval &t2)
53
{
54
timeval_t t(t1.tv_sec-t2.tv_sec,t1.tv_usec-t2.tv_usec);
55
return 0==t.tv_sec&&0==t.tv_usec;
56
}
57![]()
58
inline bool operator != (const timeval &t1,const timeval &t2)
59
{
60
return !(t1 == t2);
61
}
62![]()
63
inline bool operator < (const timeval &t1,const timeval &t2)
64
{
65
timeval t = t1 - t2;
66
return t.tv_sec < 0;
67
}
68![]()
69
inline bool operator > (const timeval &t1,const timeval &t2)
70
{
71
timeval t = t1 - t2;
72
return 0==t.tv_sec && t.tv_usec>0 || t.tv_sec>0;
73
}
74![]()
75
inline bool operator <= (const timeval &t1,const timeval &t2)
76
{
77
return !(t1 > t2);
78
}
79![]()
80
inline bool operator >= (const timeval &t1,const timeval &t2)
81
{
82
return !(t1 < t2);
83
}
extern void timeval_normalize(timeval &t);2

3
class timeval_t : public ::timeval4
{5
public:6
timeval_t(long sec = 0,long usec = 0)7
{8
tv_sec = sec, tv_usec = usec;9
timeval_normalize(*this);10
}11
12
timeval_t(const timeval& t)13
{14
if (this != &t){15
tv_sec = t.tv_sec, tv_usec = t.tv_usec;16
timeval_normalize(*this);17
}18
}19
20
timeval_t& operator = (const timeval &t)21
{22
if (this != &t){23
tv_sec = t.tv_sec, tv_usec = t.tv_usec;24
timeval_normalize(*this);25
}26
return *this;27
}28
};29

30
inline void operator += (timeval &t1,const timeval &t2)31
{32
t1.tv_sec += t2.tv_sec,t1.tv_usec += t2.tv_usec;33
timeval_normalize(t1);34
}35

36
inline void operator -= (timeval &t1,const timeval &t2)37
{38
t1.tv_sec -= t2.tv_sec, t1.tv_usec -= t2.tv_usec;39
timeval_normalize(t1);40
} 41

42
inline timeval operator + (const timeval &t1,const timeval &t2)43
{44
return timeval_t(t1.tv_sec+t2.tv_sec,t1.tv_usec+t2.tv_usec);45
}46

47
inline timeval operator - (const timeval &t1,const timeval &t2)48
{49
return timeval_t(t1.tv_sec-t2.tv_sec,t1.tv_usec-t2.tv_usec);50
}51

52
inline bool operator == (const timeval &t1,const timeval &t2)53
{ 54
timeval_t t(t1.tv_sec-t2.tv_sec,t1.tv_usec-t2.tv_usec);55
return 0==t.tv_sec&&0==t.tv_usec;56
}57

58
inline bool operator != (const timeval &t1,const timeval &t2)59
{60
return !(t1 == t2);61
}62

63
inline bool operator < (const timeval &t1,const timeval &t2)64
{65
timeval t = t1 - t2;66
return t.tv_sec < 0;67
}68

69
inline bool operator > (const timeval &t1,const timeval &t2)70
{71
timeval t = t1 - t2;72
return 0==t.tv_sec && t.tv_usec>0 || t.tv_sec>0;73
}74

75
inline bool operator <= (const timeval &t1,const timeval &t2)76
{77
return !(t1 > t2);78
}79

80
inline bool operator >= (const timeval &t1,const timeval &t2)81
{82
return !(t1 < t2);83
} 1
static const long ONE_SECOND_IN_USECS = 1000000;
2![]()
3
void timeval_normalize(timeval &t)
4
{
5
if (t.tv_usec >= ONE_SECOND_IN_USECS){
6
do {
7
++t.tv_sec;
8
t.tv_usec -= ONE_SECOND_IN_USECS;
9
}while (t.tv_usec >= ONE_SECOND_IN_USECS);
10
}else if (t.tv_usec <= -ONE_SECOND_IN_USECS) {
11
do {
12
--t.tv_sec;
13
t.tv_usec += ONE_SECOND_IN_USECS;
14
}while (t.tv_usec <= -ONE_SECOND_IN_USECS);
15
}
16![]()
17
if (t.tv_sec >= 1 && t.tv_usec < 0) {
18
--t.tv_sec;
19
t.tv_usec += ONE_SECOND_IN_USECS;
20
}
21
}
static const long ONE_SECOND_IN_USECS = 1000000;2

3
void timeval_normalize(timeval &t)4
{5
if (t.tv_usec >= ONE_SECOND_IN_USECS){6
do {7
++t.tv_sec;8
t.tv_usec -= ONE_SECOND_IN_USECS;9
}while (t.tv_usec >= ONE_SECOND_IN_USECS);10
}else if (t.tv_usec <= -ONE_SECOND_IN_USECS) {11
do {12
--t.tv_sec;13
t.tv_usec += ONE_SECOND_IN_USECS;14
}while (t.tv_usec <= -ONE_SECOND_IN_USECS);15
}16

17
if (t.tv_sec >= 1 && t.tv_usec < 0) {18
--t.tv_sec;19
t.tv_usec += ONE_SECOND_IN_USECS;20
}21
}最后来看下使用示例
1
timeval t1,t2,t3;
2
timeval_t tv1,tv2,tv3;
3
bool b;
4![]()
5
b = t1 == t2;
6
b = t1 != t2;
7
b = t1 == tv2;
8
b = t1 != tv2;
9
b = tv1 == t2;
10
b = tv1 != t2;
11
b = tv1 == tv2;
12
b = tv1 != tv2;
13![]()
14
b = t1 < t2;
15
b = t1 <= t2;
16
b = t1 > t2;
17
b = t1 >= t2;
18
b = t1 < tv2;
19
b = t1 <= tv2;
20
b = t1 > tv2;
21
b = t1 >= tv2;
22![]()
23
b = tv1 < t2;
24
b = tv1 <= t2;
25
b = tv1 > t2;
26
b = tv1 >= t2;
27
b = tv1 < tv2;
28
b = tv1 <= tv2;
29
b = tv1 > tv2;
30
b = tv1 >= tv2;
31![]()
32
t3 = t1 + t2;
33
t3 = tv1 + tv2;
34
t3 = t1 + tv2;
35
t3 = tv1 + t2;
36
tv3 = t1 + t2;
37
tv3 = tv1 + tv2;
38
tv3 = t1 + tv2;
39
tv3 = tv1 + t2;
40![]()
41
t3 = t1 - t2;
42
t3 = tv1 - tv2;
43
t3 = t1 - tv2;
44
t3 = tv1 - t2;
45
tv3 = t1 - t2;
46
tv3 = tv1 - tv2;
47
tv3 = t1 - tv2;
48
tv3 = tv1 - t2;
49![]()
50
t1 += t2;
51
t1 += tv2;
52
tv1 += t2;
53
tv1 += tv2;
54
t1 -= t2;
55
t1 -= tv2;
56
tv1 -= t2;
57
tv1 -= tv2;
timeval t1,t2,t3;2
timeval_t tv1,tv2,tv3;3
bool b;4

5
b = t1 == t2;6
b = t1 != t2;7
b = t1 == tv2;8
b = t1 != tv2;9
b = tv1 == t2;10
b = tv1 != t2;11
b = tv1 == tv2;12
b = tv1 != tv2;13

14
b = t1 < t2;15
b = t1 <= t2;16
b = t1 > t2;17
b = t1 >= t2;18
b = t1 < tv2;19
b = t1 <= tv2;20
b = t1 > tv2;21
b = t1 >= tv2;22

23
b = tv1 < t2;24
b = tv1 <= t2;25
b = tv1 > t2;26
b = tv1 >= t2;27
b = tv1 < tv2;28
b = tv1 <= tv2;29
b = tv1 > tv2;30
b = tv1 >= tv2;31

32
t3 = t1 + t2;33
t3 = tv1 + tv2;34
t3 = t1 + tv2;35
t3 = tv1 + t2;36
tv3 = t1 + t2;37
tv3 = tv1 + tv2;38
tv3 = t1 + tv2;39
tv3 = tv1 + t2;40

41
t3 = t1 - t2;42
t3 = tv1 - tv2;43
t3 = t1 - tv2;44
t3 = tv1 - t2;45
tv3 = t1 - t2;46
tv3 = tv1 - tv2;47
tv3 = t1 - tv2;48
tv3 = tv1 - t2;49

50
t1 += t2;51
t1 += tv2;52
tv1 += t2; 53
tv1 += tv2;54
t1 -= t2;55
t1 -= tv2;56
tv1 -= t2;57
tv1 -= tv2;




浙公网安备 33010602011771号