【发布时间】:2020-04-08 18:32:56
【问题描述】:
我是函数库的新手。我想将 lambda 传递给最终将 std::function<void()> 转换为 void 指针的函数。我需要将此 void 函数传递给 C API。此 lambda 还将当前类对象作为捕获。这是代码sn-p。任何帮助表示赞赏:
class Animal{
public:
Animal(std::function<void()> func){}
// call C API that takes in void(*)()
call_c_api(func); // Somehow convert func to void *
};
class Cat{
private:
std::string m_name;
Animal m_animal;
public:
static StaticCatFunc(Cat*instance){
std::cout << "Name: " << instance->m_name <<"\n";
}
Cat(){
m_animal = new Animal([this](){StaticCatFunc(this);})
}
};
我需要实现上述功能。这不是继承相关的问题。我需要以某种方式将带有捕获的 lambda 转换为 void 指针。我读过带有捕获的 lambdas 不能转换为原始指针。有没有办法实现这个功能?任何帮助表示赞赏。
===========更新=========
c api 看起来像这样:
call_c_api(void (*handler)());
【问题讨论】:
-
这是不可能的。您需要擦除捕获才能使其正常工作。
std::function<void()>可能是也可能不是void(*)(void):[]{}是,[&]{}不是。 -
没有显示“
void指针转换”的实际含义,没有太多可说的。在那之前,答案是:你不能。 -
您需要擦除类型并传递上下文指针。例如:
void c_api(void(*callback)(void*), void* context);。然后在c++中,创建上下文指针并将函数指针传递给c api。 -
@sturcotte06,你能解释一下吗?谢谢!
-
C API 将如何处理指针?它会作为函数调用它吗?还是只是将其存储并稍后传回给您?
标签: c++ c c++11 std-function stdbind