如何在c ++ 11中存储任意方法指针?

时间:2015-05-26 01:24:14

标签: c++ list c++11 store member-function-pointers

我需要一种存储方法指针列表的方法,但我不关心它们属于哪个类。我考虑到了这一点:

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()中的函数指针。

我需要这个的原因是因为我有一个可以发出事件的类 - 我希望任意实例作为方法调用订阅这些事件。这可能吗?

PS。条件适用: 我不想使用Boost 2.我不想使用'Listener'接口,其中订阅者必须子类化抽象接口类。

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

我相信你只是在寻找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();
    ...
}