You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:03:09