因此,我坚持让C ++类模仿常规函数,从而陷入困境。当然,该类会重载函数运算符,使其成为函子。一切正常,直到您要传递此函子的函数指针为止。
自然地,我想通过对该指针进行reinterpret_cast来让编译器知道我们在做什么(笑)。但是,由于它是一个重载运算符,因此如何获取该特定成员函数的地址。一个人怎么得到那个地址?
更新:您要求一个示例。这是最小的一个。
所以我有一个不能更改的界面。看起来像这样;
typedef void (*some_callback_t)(SomeType);'
void someFunc(some_callback_t);
现在,这很简单。 API正在设置一些回调函数指针。因此,想法是像往常一样,通过重载operator()
来将回调实现为函子类。
class Bah {
void operator()(SomeType);
};
问题来了;看到我无法更改所使用的API(期望具有特定签名的函数指针的函数),那么我该如何获取成员函数的地址并将其传递呢?
我怀疑它会发生类似的事情;
someFunc(reinterpet_cast<some_callback_t>( ? ? ? ));
,以确保编译器不会对我发怒。
答案 0 :(得分:3)
假设您必须使用函数指针,并且您的函子没有状态,则可以使用lambda作为胶水:
Javadoc
答案 1 :(得分:2)
一个人怎么得到那个地址?
与其他任何成员函数相同。该函数的名称为class_name::operator()
。一个例子:
struct class_name {
void operator()(){}
};
void (class_name::*member_function_pointer)() = &class_name::operator();
class_name instance;
(instance.*member_function_pointer)(); // in a block scope
自然地,我想通过对该指针进行reinterpret_cast来让编译器知道我们在做什么(笑)。
那通常不是人们想要做的。