C ++将类的重载operator()传递为函数指针

时间:2019-02-12 13:41:31

标签: c++ overloading operator-keyword

因此,我坚持让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>( ? ? ? ));,以确保编译器不会对我发怒。

2 个答案:

答案 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来让编译器知道我们在做什么(笑)。

那通常不是人们想要做的。