【问题标题】:How to store arbitrary method pointers in c++11?如何在 c++11 中存储任意方法指针?
【发布时间】:2015-08-07 12:11:33
【问题描述】:

我需要一种方法来存储方法指针列表,但我不关心它们属于哪个类。我有这个想法:

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。适用条件: 1.我不想使用Boost 2. 我不想使用“Listener”接口,订阅者必须继承抽象接口类。

感谢您的宝贵时间。

【问题讨论】:

  • 让每个类都继承同一个基类怎么样?可以是空的,只是可以去掉模板。
  • 你想要的已经存在于标准库/中,并且被称为function 好吧,这不是一回事,但它是我用于信号/插槽机制的东西。请注意,已经有 C++ 的信号槽库。如果我记得的话,Boost 至少有一个。
  • 做一些强制转换,所有方法指针的大小都一样。
  • @user1095108:这是一个糟糕、糟糕、糟糕的想法。
  • blogs.msdn.com/b/oldnewthing/archive/2004/02/09/70002.aspx 太可怕了。成员函数指针不是大小都一样,理论上不一样,实际上也不一样。

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


【解决方案1】:

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

【讨论】:

  • 如果我存储的方法指针也带有参数,这是否也适用? 编辑我刚刚意识到它确实如此,只要我将 std::placeholders::_1 添加到 std::bind 即可。例如 std::bind(method, obj, std::placeholders::_1);
  • @mrmclovin 如果要存储参数,可以。如果你想稍后用参数调用它,没有。
  • 嗯,我开始认为 std::bind 不是我要找的东西。 Bind 会将参数与函数绑定并存储。或者,您可以在调用函数时使用 std::placeholders 提供参数。也许我正在寻找 std::mem_fn。如何获得包含不同类类型实例的 std::mem_fn 列表?
  • @mrmclovin 如果您有新问题,请提出新问题。
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 2011-02-02
  • 2013-01-06
  • 2019-02-03
  • 2013-11-22
相关资源
最近更新 更多