如何在 C++11 中存储任意方法指针?
How to store arbitrary method pointers in c++11?
我需要一种方法来存储方法指针列表,但我不关心它们属于什么 class。我想到了这个:
struct MethodPointer
{
void *object;
void (*method)(void);
};
然后我可以有一个采用任意方法的函数:
template <typename T>
void register_method(void(T::*method)(void), T* obj) {
MethodPointer pointer = {obj, method);
}
void use_method_pointer() {
...
MethodPointer mp = ...
// call the method
(mp.object->*method)();
...
}
这显然无法编译,因为我无法在 register_method() 中将方法指针转换为函数指针。
我需要这个的原因是因为我有一个可以发出事件的 class - 我希望任意实例以方法调用的形式订阅这些事件。这可能吗?
PS。适用条件:
1.不想用Boost
2. 我不想使用 'Listener' 接口,订阅者必须从 class 抽象接口 class.
感谢您的宝贵时间。
我相信你只是在寻找std::function
:
using NullaryFunc = std::function<void()>;
报名人数:
template <typename T>
void register_method(void(T::*method)(void), T* obj) {
NullaryFunc nf = std::bind(method, obj);
// store nf somewhere
}
用法:
void use_method() {
...
NullaryFunc nf = ...;
// call the function
nf();
...
}
我需要一种方法来存储方法指针列表,但我不关心它们属于什么 class。我想到了这个:
struct MethodPointer
{
void *object;
void (*method)(void);
};
然后我可以有一个采用任意方法的函数:
template <typename T>
void register_method(void(T::*method)(void), T* obj) {
MethodPointer pointer = {obj, method);
}
void use_method_pointer() {
...
MethodPointer mp = ...
// call the method
(mp.object->*method)();
...
}
这显然无法编译,因为我无法在 register_method() 中将方法指针转换为函数指针。
我需要这个的原因是因为我有一个可以发出事件的 class - 我希望任意实例以方法调用的形式订阅这些事件。这可能吗?
PS。适用条件: 1.不想用Boost 2. 我不想使用 'Listener' 接口,订阅者必须从 class 抽象接口 class.
感谢您的宝贵时间。
我相信你只是在寻找std::function
:
using NullaryFunc = std::function<void()>;
报名人数:
template <typename T>
void register_method(void(T::*method)(void), T* obj) {
NullaryFunc nf = std::bind(method, obj);
// store nf somewhere
}
用法:
void use_method() {
...
NullaryFunc nf = ...;
// call the function
nf();
...
}