gpt4 book ai didi

c++ - 指向类的指针和指向方法的指针

转载 作者:行者123 更新时间:2023-11-30 05:42:59 26 4
gpt4 key购买 nike

如何制作指向类和成员函数的双指针?

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

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

在类里面,我经常有这样的功能

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

或方法/函数双胞胎

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);

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

由于各种原因我不能为类类型使用模板,所以

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

我别无选择

最佳答案

您似乎想要的是能够注册任何 接受零参数并返回 void 的可调用对象。由于您可能会将这些回调存储在某个地方,因此您还需要类型删除 - 因为您希望能够调用 Foo::doSomething()doSomethingElse()甚至Bar::someMethod(with, some, args)不可知论地。对于所有这些,还有更多,有 std::function .特别是在你的情况下,std::function<void()> .

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

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

关于c++ - 指向类的指针和指向方法的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30411218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com