blueyi's notes

Follow Excellence,Success will chase you!

0%

C/C++拾遗之函数对象

函数对象即是定义了函数调用运算符()的类的对象,该类表现上像个函数,参见http://notes.maxwi.com/2015/12/13/CPP-OOP/#函数调用运算符
通过函数对象的方式即简洁又可以方便地实现调用含有不同参数类型的函数对象
以下代码分别使用函数对象和函数指针进行举例:

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
/*
* fun_obj.cpp
* Copyright (C) 2016 <@BLUEYI-PC>
* 分别使用函数指针和函数对象实现随机通过调用不同的函数随机返回两个数中较大或较小的功能
* Max返回两个数中较大的,Min返回较小的
* Distributed under terms of the MIT license.
*/

#include <iostream>
#include <random>
#include <ctime>
//重载了函数调用运算符()的类
template <typename T> class Max{
public:
T operator()(const T &a, const T &b) const
{
return a > b ? a : b;
}
};

template <typename T> class Min{
public:
T operator()(const T &a, const T &b) const
{
return a > b ? b : a;
}
};

//通过函数对象的方法调用函数
template <typename T, typename VST> T max_or_min(const T &a, const T &b, const VST &func)
{
return func(a, b);
}

//通过函数指针的方法调用函数
template <typename T> T max_or_min(const T &a, const T &b, T (*func)(const T&, const T&))
{
return func(a, b);
}

int main(void)
{
Max<int> maxObj;
Min<int> minObj;
std::default_random_engine e(time(NULL));
std::uniform_int_distribution<int> u(0, 19);
int a = 5, b = 9;
//通过调用函数对象的函数随机输出a,b中较大或较小的
std::cout << "***Function object***" << std::endl;
for (int i = 0; i < 10; ++i) {
if (u(e) % 2 == 0)
std::cout << max_or_min(a, b, maxObj) << std::endl;
else
std::cout << max_or_min(a, b, minObj) << std::endl;
}

//通过调用函数指针的函数随机输出a,b中较大或较小的
std::cout << "***Function pointer***" << std::endl;
for (int i = 0; i < 10; ++i) {
if (u(e) % 2 == 0)
std::cout << max_or_min(a, b, maxObj) << std::endl;
else
std::cout << max_or_min(a, b, minObj) << std::endl;
}

return 0;
}

Welcome to my other publishing channels