编程语言
首页 > 编程语言> > 演示C++成员函数参数的使用

演示C++成员函数参数的使用

作者:互联网

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
// Copyright © 2022, 飞麦 <fitmap@qq.com>, All rights reserved.

// 演示成员函数参数的使用

#include <cstdio>
#include <ctime>

// 简化的日期类型(仅示例)
using Datep = time_t;

// 示例的任意结构
struct AnyStruct {
  Datep date; // 标识数值所属日期
  double value; // 外部函数需要获该值用于计算

  // 获取数值的类函数(静态成员函数)
  static double any_static_func(AnyStruct& any) {
    return any.value;
  }

  // 获取数值的对象函数(动态成员函数)
  double any_dynamic_func() {
    return value;
  }
};

// 类函数的引用(静态成员函数的引用)
using AnyStaticFunc = double(&)(AnyStruct&);

// 通过类函数参数调用该函数
double call_static_func(AnyStruct& node, AnyStaticFunc any_func) {
  return any_func(node);
}

// 对象函数的指针(动态成员函数的指针)【注: 动态成员函数无法定义引用】
using AnyDynamicFunc = double (AnyStruct::*)();

// 通过对象函数参数调用该函数
double call_dynamic_func(AnyStruct& node, AnyDynamicFunc any_func) {
  return (node.*any_func)(); // 注意 node.*any_func 两边的括号必须要有
}

// 获取今日日期
Datep get_today() {
  return time(0); // 返回 1970-01-01 00:00:00 到当前时刻的秒数
}

// 获取次日日期
Datep get_next_date(Datep date) {
  return date + 86400; // 每天粗略计为 86400 秒, 增加这么多秒相当于前进 1 天
}

// 将日期转换为年-月-日格式
char* ymd(Datep date) {
  static char str[16]; // 年-月-日占用 10 字节, 再加结尾的 \0 至少 11 字节
  tm mytm; // 年/月/日/时/分/秒 加其它一些属性的复杂结构
  localtime_s(&mytm, &date); // 将 time_t 转换为 tm (本地时刻)
  strftime(str, sizeof(str), "%F", &mytm); // 将 tm 结构以年-月-日格式转换为字符串
  return str;
}

// 调用 100 次静态成员函数与动态成员函数
int main() {
  AnyStruct* arr = new AnyStruct[100]{}; // 100 个任意结构的数组, 初始化为零
  auto date = get_today(); // 获取今日日期作为日期的初始值
  auto value = 1.0; // 以 1.0 为数值的初始值
  for (auto i = 0; i < 100; i++) { // 循环 100 次
    auto ele = arr[i]; // 获取第 i 个元素
    ele.date = date; // 第 i 个元素日期域的赋值
    ele.value = value; // 第 i 个元素数值域的赋值
    date = get_next_date(date); // 日期向前推进 1 天(示例)
    value *= 1.01; // 数值放大 1%(示例)
    auto static_dbl = call_static_func(ele, AnyStruct::any_static_func); // 以静态成员函数引用为参数来调用
    auto dynamic_dbl = call_dynamic_func(ele, &AnyStruct::any_dynamic_func); // 以动态成员函数地址(&)为参数来调用
    if (static_dbl != ele.value) // 若调用静态成员函数结果有误
      throw "Fail static!"; // 提示异常信息并退出
    if (dynamic_dbl != ele.value) // 若调用动态成员函数结果有误
      throw "Fail dynamic!"; // 提示异常信息并退出
    printf("i=%2d, d=%s, v=%f\n", i, ymd(ele.date), ele.value); // 显示下标、日期、数值
  }
}

标签:演示,函数,AnyStruct,C++,函数参数,value,func,date,any
来源: https://www.cnblogs.com/fitmap/p/16310044.html