首页 > 解决方案 > 将 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?

标签: c++templateslambda

解决方案


您可以制作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;
  });
}

推荐阅读