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
相关产品推荐
相关产品推荐

