指向 Class 的指针和指向方法的指针

Pointer to Class AND pointer to method

如何使双指针指向class和成员函数?

基本上,我有一些(相当多的)通用 classes 接受这样的函数指针:

void Gen::regCallback(void (*callback)(void const *), void const * callbackData)

在 classes 中,我经常有这样的功能

void Foo::doSomething(void const * instance) // this one is static
{
    auto myself((Foo const *)instance);
    myself->...do stuff...
    myself->...do stuff...
    myself->...do stuff...
}

或method/function双胞胎

void Foo::doSomething(void const * instance) // this one is static
{
    ((Foo const *)instance)->doSomething();
}
void Foo::doSomething() const
{
    ...do stuff...
    ...do stuff...
    ...do stuff...
}

我想以某种方式减少代码中的混乱(通过直接注册成员), 我知道选项:

void Gen::regCallback(void (Foo::*callback)(void const *), Foo const * member);

但我还需要 class 类型 (Foo) 作为参数传递(即 Foo1、Foo2、FooTotallyDifferent)

由于各种原因我无法使用 class 类型的模板,所以

template <typedef T>
class Gen
{
    void regCallback(void (T::*callback)(void const *), T const * member)
    {
        ...
    }
}

我别无选择

看来您想要的是能够注册 any 可调用参数为零且 returns 无效。由于您可能会将这些回调存储在某个地方,因此您还需要类型擦除 - 因为您希望能够调用 Foo::doSomething()doSomethingElse() 甚至 Bar::someMethod(with, some, args) 不可知论。对于所有这些,还有更多,有 std::function。具体在您的情况下,std::function<void()>.

用法很简单。 std::function<void()> 可以从匹配该签名的任何函数构造。下面是一个示例,它将几种不同的可调用类型添加到一个 std::function 类型的向量中:

using Callback = std::function<void()>;
std::vector<Callback> callbacks;

void free() { std::cout << "free\n"; }
void free(int arg) { std::cout << "free " << arg << "\n"; }
struct Foo {
    void something() const { std::cout << "Foo with " << i << "\n"; }

    int i;
};

callbacks.emplace_back(free); // normal function pointer

Foo f;
callbacks.emplace_back(std::bind(&Foo::something, f)); // member function bound to instance, copies f

callbacks.emplace_back([]{ free(42); }); // lambda calling function with specific argument

f.i = 64;
callbacks.emplace_back([&]{ f.something(); }); // captures f
f.i = 72;

// call all of them
for (auto fn : callbacks) {
    fn();
}

这将打印

free
Foo with 42
free 42
Foo with 72