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
|
#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; 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; } 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; }
|