ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-25 17:32:28  阅读:127  来源: 互联网

标签:演示 函数 AnyStruct C++ 函数参数 value func date any


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有