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

C++正则绑定函数指针vector调用匹配函数时出现函数类型报错

问题背景

需求为维护一组正则表达式与对应处理函数的映射关系,当用户输入匹配某条正则规则时,自动调用该规则绑定的处理函数。当前使用如下C++代码实现:

// 定义存储正则、处理函数对的vector
vector<pair<regex, void (*)(string)>> patterns;
// 存入第一条正则与绑定函数
patterns[0].first = pattern;
patterns[0].second = func1;
// 存入第二条正则与绑定函数
patterns[1].first = pattern2;
patterns[1].second = func2;
// 读取用户输入
string input;
cin >> input;
// 遍历所有规则做匹配
for (int i = 0; i < patterns.size(); i++)
{
    if (regex_match(input, patterns[i].first)) // 输入匹配当前正则时,调用绑定的函数
    {
        patterns[i].second(input);
    }
}
报错现象

代码编译到patterns[i].second(input);语句时触发错误,错误信息为:

the expression preceding parentheses of apparent call must have (pointer-to-) function type
含义:调用括号前的表达式必须为函数或函数指针类型。

错误原因

触发该错误有两个常见诱因:

  • 空vector下标越界:刚定义的patterns是空vector,没有任何元素,直接通过patterns[0]、patterns[1]下标访问属于未定义行为,对应内存空间的值是随机乱值,second字段自然不是合法的函数指针,调用时就会报类型错误。
  • 函数签名不匹配:如果绑定的func1、func2的函数签名和vector声明的void (*)(string)不一致——比如参数是string&/const string&、返回值不是void,会出现类型不匹配,导致存储的second字段无法被识别为合法函数指针。
修复方案
  • 禁止对空vector使用下标赋值,改用push_back、emplace_back插入元素,或者初始化vector时就预留好对应数量的元素,确保访问的元素是合法构造的。
  • 统一函数指针与绑定函数的签名,字符串传参建议用const string&避免无意义的拷贝,对应修改vector的模板类型即可。

修复后的参考代码:

#include <iostream>
#include <vector>
#include <regex>
#include <string>
using namespace std;

// 示例处理函数,签名和函数指针类型完全匹配
void func1(const string& s) { /* 匹配pattern1的处理逻辑 */ }
void func2(const string& s) { /* 匹配pattern2的处理逻辑 */ }

int main() {
    vector<pair<regex, void (*)(const string&)>> patterns;
    // 用push_back插入元素,避免下标越界
    patterns.push_back({regex(pattern), func1});
    patterns.push_back({regex(pattern2), func2});

    string input;
    cin >> input;
    for (int i = 0; i < patterns.size(); i++) {
        if (regex_match(input, patterns[i].first)) {
            patterns[i].second(input);
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Ammarios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:48:52