演示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