C++中如何传递并比较函数指针?实现指针对应函数标识
搞定函数指针的名称映射问题
嘿,这个需求其实很好实现!C++里函数指针支持直接比较相等性,所以我们可以给每个函数指针绑定对应的名称字符串,通过查找映射表来返回标识。
具体做法看这里:
首先先给你的函数指针类型整个别名,省得每次写一大串签名,代码清爽很多:
// 定义函数指针类型别名 using InterpFunc = dvec3 (*)(dvec3, dvec3, double);
然后写个专门的函数来做映射,我们用静态的哈希表存指针和名字的对应关系,这样只会初始化一次,效率也高:
#include <unordered_map> #include <string> std::string getFunctionName(InterpFunc func) { // 静态映射表,键是函数指针,值是对应的名字 static const std::unordered_map<InterpFunc, std::string> funcNameMap = { {lerp, "lerp"}, {plerp, "plerp"}, {slerp, "slerp"}, {ilerp, "ilerp"} }; // 查找对应的名字 auto match = funcNameMap.find(func); if (match != funcNameMap.end()) { return match->second; } // 处理没匹配到的情况,返回默认标识 return "Unknown interpolation function"; }
用起来超简单:
不管是遍历你的vector还是单独传函数指针,直接调用这个函数就行:
#include <vector> #include <iostream> int main() { std::vector<InterpFunc> methods = {lerp, plerp, splerp, ilerp}; for (auto func : methods) { std::cout << "当前使用的插值函数:" << getFunctionName(func) << std::endl; } return 0; }
几个小提醒:
- 这个方法只适用于全局函数、静态成员函数,如果是非静态成员函数,函数指针会包含类的类型,那映射表的键得改成对应的成员函数指针类型才行。
- 如果函数是跨编译单元的,只要链接正常,函数地址的比较是没问题的;但如果是inline函数或者模板特化,要确保每个编译单元里的函数地址一致(一般编译器都会处理好,但特殊情况要留意)。
- 要是以后加新的插值函数,只要在
funcNameMap里添个新的键值对就搞定,扩展性拉满。
对了,要是你用的是C++17及以上版本,还可以用std::string_view代替std::string,减少不必要的字符串拷贝,性能更好:
static const std::unordered_map<InterpFunc, std::string_view> funcNameMap = { {lerp, "lerp"}, {plerp, "plerp"}, {slerp, "slerp"}, {ilerp, "ilerp"} };
这样就能完美满足你的测试需求啦!
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

