C++20下实现自动推导的makeWrapper:constexpr函子转C风格函数指针
可行!C++20自动推导的constexpr函子转C风格函数指针实现
完全可以实现无需手动指定模板参数的makeWrapper,核心思路是通过函子实例作为函数参数让编译器自动推导类型,结合C++20允许constexpr lambda转换为函数指针的特性完成实现。
具体实现代码及说明
- 定义C风格函数指针类型(与你现有代码一致):
using DblFn = double(*)(double, double);
- 实现带自动推导的
makeWrapper:
#include <concepts> // 可选:用概念约束强制函子符合要求(接受两个double参数,返回double) template <typename Functor> concept DblBinaryOp = std::invocable<const Functor&, double, double> && std::same_as<std::invoke_result_t<const Functor&, double, double>, double>; template <DblBinaryOp Functor> constexpr DblFn makeWrapper(Functor) { // constexpr无捕获lambda可自动转为C风格函数指针 return [](double a, double b) -> double { // 编译期构造constexpr函子并调用 return Functor{}(a, b); }; }
- 示例constexpr函子:
struct AddFunctor { constexpr double operator()(double a, double b) const { return a + b; } }; struct SubFunctor { constexpr double operator()(double a, double b) const { return a - b; } };
- 使用方式(无需手动指定模板参数):
// 编译期自动推导函子类型,生成C风格函数指针 constexpr auto add_ptr = makeWrapper(AddFunctor{}); constexpr auto sub_ptr = makeWrapper(SubFunctor{}); // 编译期/运行期调用均可 double sum = add_ptr(1.2, 3.4); // 结果4.6 double diff = sub_ptr(5.0, 2.7); // 结果2.3
核心原理
- 模板参数自动推导:通过传递
AddFunctor{}这类constexpr函子实例,编译器自动推导makeWrapper的模板参数Functor,省去手动指定的麻烦。 - constexpr lambda转函数指针:C++20允许无捕获的constexpr lambda隐式转换为对应签名的C风格函数指针,这是实现的核心基础。
- 零运行时开销:所有推导、函子构造和包装函数生成都在编译期完成,运行时仅执行C风格函数调用,完全适配FFI的性能需求。
适配你的库场景
该方案完美匹配你的需求:
- C++客户端无需关注模板参数细节,通过
makeWrapper即可一键生成符合ABI要求的C风格函数指针; - 生成的
DblFn指针可直接传入你的C风格接口,保持跨语言调用的一致性。
内容的提问来源于stack exchange,提问作者jamadagni
相关产品推荐
相关产品推荐

