C++利用友元实现装饰器函数与管道符重载调用
Jacshuo Lv3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <functional>
#include <iostream>
// 一个利用友元实现装饰器函数,并重载|成为管道符的链式调用装饰器函数的例子,不想用装饰器类可选择装饰器函数模式
class A; //前置定义
typedef std::function<A&(A&)> Decorator; // 装饰器函数定义,接受一个A的引用,返回一个A的引用

//-----------------------------------------
// Class A declaration
class A
{
public:
A();
//------------------------------------------------
friend A& Plus(A&); // 定义一个非成员函数为友元。
friend A& Divide(A&); // 定义一个非成员函数为友元
friend A& Multiply(A&); // 定义一个非成员函数为友元
//-------------------------------------------------
A& Minus(A& a); // 传统的成员函数支持的链式调用
void Print();

private:
std::string myStr;
};
//-----------------------------------------

//-----------------------------------------
// Class A constructor definition
A::A() : myStr("这是一个例子文本")
{
}
//-----------------------------------------
// class A minus member function definition
A& A::Minus(A& a)
{
a.myStr += "-";
return a;
}
//-----------------------------------------
// Print function definition
void A::Print()
{
std::cout << myStr << std::endl;
}
//-----------------------------------------

//------------non-member friend--------------------------
A& Plus(A& a) // 作为友元的非成员函数
{
a.myStr += "+"; // 可访问私有成员
return a;
}

A& Divide(A& a) // 作为友元的非成员函数
{
a.myStr += "/"; // 作为友元的非成员函数
return a;
}

A& Multiply(A& a) // 作为友元的非成员函数
{
a.myStr += "*"; // 作为友元的非成员函数
return a;
}
//--------------Operator reload---------------------------
A& operator|(A&, const Decorator&); // 重载 | 管道符(注意是重载是采用的非成员函数,第一个参数为运算符左边的值,第二个参数为运算符右边的值)

A& operator|(A& classA, const Decorator& decorator) // 重载的实现
{
return decorator(classA);
}
//-----------------------------------------


int main()
{
A a;
a | Plus | Divide | Multiply; // 管道符重载与友元函数配合使用,优雅的链式/函数调用
// 上述方式等价于,但更加优雅:
// Multiply(Divide(Plus(a)));
a.Minus(a).Minus(a).Minus(a); //传统方式
a.Print(); // 输出:”这是一个例子文本+-*---“
return 0;
}


  • 本文标题:C++利用友元实现装饰器函数与管道符重载调用
  • 本文作者:Jacshuo
  • 创建时间:2023-03-08 10:14:58
  • 本文链接:https://blog.imade.life/2023/03/08/C-利用友元实现装饰器函数/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!