这与代码生成有关。
我有一个类A
,它是从模型生成的,其中我有两个函数f
的重载,如下所示:
class A
{
public:
void f(int a){}
void f(int a, int b){}
}
然后我有一个系统的单独部分,它不是从模型生成的,而是用手工编写的C ++编写的。在这里,我想访问对象上的函数f
。从模型中我可以将数据传递给系统的手工制作部分,但不是相反,因为当我构建手工制作的代码时,生成的文件不可用于编译。
我的想法是将函数指针从模型传递到我需要它的位置。正如我迄今为止所理解的那样,这包括static_cast
来解决重载问题,然后我可以将指向函数的指针作为参数传递给其他手工制作的函数。
用于将指针传递给系统手工制作部分的函数声明如下(此处A
未知):
void passPointer(int, void (*f)(int, int));
我的演员和函数调用如下:
handCraftedObject->passPointer(17, static_cast<void (A::*)(int, int)> (&A::f) );
我的编译错误是:
: no known conversion for argument 2 from 'void (A::*)(int, int)' to 'void (*)(int, int)
我希望这并不意味着我必须知道传递函数指针的函数声明的类A
。这在我的系统中是不可能的。
答案 0 :(得分:2)
成员函数指针与函数指针的类型不同,无法转换为它。最简单的方法是使用boost / std(C ++ 11)bind
和function
。
void passPointer(int, const std::function<void(int, int)>&);
而不仅仅是
handCraftedObject->passPointer
(
17, std::bind(static_cast<void (A::*)(int, int)> (&A::f), std::ref(a_instance),
std::placeholders::_1, std::placeholders::_2)
);
你也不能使用boost / C ++ 11,你可以创建函数f
static
,然后一切正常。