C++14中如何用typedef定义函数指针并绑定传入的地址参数?
C++14函数内模板化函数指针指向整数地址的实现问题
需求
在C++14(VS2019)环境下,实现一个模板函数,在函数内部定义一个函数指针:
- 函数指针的返回值类型、参数类型由模板参数指定
- 将该指针指向以整数形式传入的已有函数的地址
- 最终调用这个函数指针并返回结果
错误代码及编译报错
错误代码1
template <class retTempl, class argTempl_1, class argTempl_2> retTempl TEST_1(argTempl_1 value1, argTempl_2 value2, int addr) { typedef retTempl(*TEST_2)(argTempl_1, argTempl_2); return TEST_2(value1, value2); }
编译报错:Error C2440 '<function-style-cast>': cannot convert from 'initializer list' to 'operationFunction'
错误代码2
template <class retTempl, class argTempl_1, class argTempl_2> retTempl TEST_1(argTempl_1 value1, argTempl_2 value2, int addr) { typedef retTempl(*TEST_2)(argTempl_1, argTempl_2); TEST_2 = addr; return TEST_2(value1, value2); }
编译报错:Error C2513 'retTempl (__cdecl *)(argTempl_1,argTempl_2)': no variable declared before '='
可行性与正确实现
该需求完全可实现,原代码的核心问题是语法逻辑错误:
- 错误代码1:错误地将函数参数作为函数指针的初始化值,而非传入的整数地址;
- 错误代码2:仅定义了函数指针类型,未声明对应变量,直接对类型赋值属于语法错误。
正确实现代码
#include <cstdint> template <class retTempl, class argTempl_1, class argTempl_2> retTempl TEST_1(argTempl_1 value1, argTempl_2 value2, uintptr_t addr) { // 用using定义函数指针类型(比typedef更直观) using FuncPtr = retTempl(*)(argTempl_1, argTempl_2); // 整数地址转函数指针:C++要求先转void*再转目标指针类型 FuncPtr targetFunc = reinterpret_cast<FuncPtr>(reinterpret_cast<void*>(addr)); // 调用函数指针并返回结果 return targetFunc(value1, value2); }
关键说明
- 使用uintptr_t而非int:
int的宽度不一定与指针宽度匹配(如64位系统中int为32位,指针为64位),uintptr_t是标准库提供的专门用于存储指针的整数类型,保证能容纳任意指针值; - 指针转换规则:C++不允许整数直接转换为函数指针,必须通过
void*作为中间类型,使用reinterpret_cast完成转换; - VS2019设置:若触发C4312警告("类型转换从void*到更大的指针类型"),可在项目设置中禁用该警告,或通过
#pragma warning(disable:4312)临时屏蔽; - 安全性:必须确保传入的
addr确实是与模板参数指定的签名完全匹配的函数地址,否则调用会导致未定义行为。
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

