指向 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
如何使双指针指向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