c++ - 将 lambdas 作为 C 函数指针传递
问题描述
我正在研究一个将无捕获 lambda 传递给 C 库的 C++ 类。我想删除一些样板文件,并且 lambdas 都非常相似(它们找到一个类的实例并调用所有采用单个 int 参数的不同方法)。我创建了一个模板函数:
typedef unsigned char (Foo::*FooMemPtr)(int ch);
template<typename Fn>
tuple<const char*, const char*, Fn> createEditLineCommandDescriptor(const char* command, const char* helpText, const FooMemPtr callback) {
return make_tuple(command, helpText, [] (EditLine*, int ch) {
Foo foo;
((&foo)->*callback)('a');
return ch;
});
}
当我编译这个时,我得到一个关于 lambda 试图隐式捕获的错误callback
,这是有道理的。我想知道,因为我在一个模板中,并且createEditLineCommandDescriptor
使用常量地址成员函数参数调用,有没有办法让编译器在实例化模板时生成 lambda 而不会尝试捕获参数C++11?
解决方案
您可以制作callback
模板参数,并在调用时指定模板参数而不是传递函数参数createEditLineCommandDescriptor
。例如
template<typename Fn, FooMemPtr callback>
tuple<const char*, const char*, Fn> createEditLineCommandDescriptor(const char* command, const char* helpText) {
return make_tuple(command, helpText, [] (EditLine*, int ch) {
Foo foo;
((&foo)->*callback)('a'); // or (foo.*callback)('a');
return ch;
});
}
推荐阅读
- python - 无法让python加载json文件
- openssl - RSA_generate_key_ex 函数调用中的 RSA 密钥生成错误
- wordpress - 如何禁用
在wordpress中没有禁用标签的标签 - haskell - 对于具有嵌套 Maybe 值的 Tree 数据类型,Traversable 实例应该是什么样子?
- reactjs - 输入标签不在选择下拉框的中心
- excel - 同一范围内的最后 2 行
- python - 解决问题 - 编码面试问题?
- sql - 如何查询表中的传递匹配?
- c# - 如何在异步数据库连接期间避免“访问冲突”?
- linux - 从数据文件的每一行中提取 2 个字段并插入到外部程序中