非模板类CFnSaver如何保存任意返回类型的函数及参数?
问题:创建可保存函数指针、参数及返回类型的类
需求说明
我想要创建一个类来保存函数指针、参数以及返回类型。当前实现中返回类型被硬编码为int,且因为需要创建std::vector<CFnSaver*>数组,无法直接使用模板类,希望找到合适的实现方式。
当前实现的函数保存类
// 此处无法使用模板,因为下一步我要创建CFnSaver的数组('std::vector<CFnSaver*>') // template<typename T> class CFnSaver { public: // 此处不能使用模板,编译器会报错 // template<typename T> std::function<int()> savedFn; template<typename ... Args> constexpr bool Save(void* pFn, Args ... args) { if (!pFn) return false; // 创建Lambda函数 auto lambdaFn = [pFn, args...]() { // 我需要获取函数的返回类型,而不是像现在这样硬编码为'int' using tempFn = int(*)(Args ...); auto tempFunc = reinterpret_cast<tempFn>(pFn); return tempFunc(args...); }; // 这里可以调用原函数并获取结果,例如'5',但我现在不需要 // auto res = lambdaFn(); // 将Lambda保存到std::function中 savedFn = lambdaFn; return !!savedFn; } inline CFnSaver() {}; template<typename ... Args> inline CFnSaver(void* pFn, Args ... args) { Save(pFn, args...); } bool const operator ! () const { return(!savedFn); } explicit operator bool() const { return !!savedFn; } };
使用示例
int printSum(int a, int b) { int sum = a + b; printf_s("%d\n", sum); return sum; } int main() { CFnSaver cfn(printSum, 2, 3); // 我需要获取该函数的返回值(现在被硬编码为int) auto res = cfn.savedFn(); return 0; }
不满意的替代方案
我尝试过通过引用传递变量获取结果,但这个方案并不理想:
void printSum(int a, int b, int& result) { int sum = a + b; printf_s("%d\n", sum); result = sum; } int main() { int result = 0; CFnSaver cfn(printSum, 2, 3, result); cfn.savedFn(); return 0; }
已尝试的方法
- 模板类(但无法用于创建统一的数组)
- 模板函数
- 引用传参
希望得到帮助,找到能保存任意返回类型函数的实现方式。
内容的提问来源于stack exchange,提问作者Jaja Jeje
相关产品推荐
相关产品推荐

