【问题标题】:How to implement a class member pointer in C++ using std::function or Boost?如何使用 std::function 或 Boost 在 C++ 中实现类成员指针?
【发布时间】:2014-12-03 16:46:33
【问题描述】:

我想在 C++ 中实现一个面向对象的函数指针(类似于 C# 中的委托)。

我写了一个示例代码,它使用“MagicFunctionPainter”作为最终类的占位符:

class A
{
public: 
    MagicFunctionPointer p;
    void fireEvent()
    {
         p();
    }
};

class B
{
public:
    void init(A* a)
    {
        a->p = &onEvent;
    }
    void onEvent()
    {
        // in a real-world app, it'd modify class variables, call other functions, ...
    }
};

std::function 或 Boost::Signals2 支持吗?还有其他支持这种情况的库吗?

提前谢谢你!

【问题讨论】:

  • @sehe:如果你指的是我:这是我唯一的 StackOverflow 帐户。
  • 好的(我通常是指我向其发表评论的人,是的)。没关系。这些问题的对应关系非常出色。很快就会删除这些 cmets

标签: c++ oop c++11 boost boost-signals2


【解决方案1】:

p 的类型应该是:

std::function<void(void)> // a function taking no arguments, returning nothing

B::init 中创建此类型的对象:

std::bind(&B::onEvent, this);

【讨论】:

  • 我试过 a-&gt;p = std::bind&lt;void&gt;(&amp;B::onEvent, this); 但这不能编译。我的编译器 (g++ 4.8.3) 返回了一些错误:首先,functional 标头中出现了几次 function returning a function 和指定行中的 no match for operator=
  • @user3684240 无法重现,ideone 显示了一个工作示例:ideone.com/yLCUtG 你确定你没有不小心剥离了一些东西吗?您是否将std::function 的签名正确匹配到类成员函数之一?
  • @user3684240 如果您没有绑定函数的所有参数,则需要使用占位符:a-&gt;p = std::bind(&amp;B::onEvent, this, std::placeholders::_1); 是正确的。如果这看起来很复杂,那么 lambda 也可以完成这项工作:a-&gt;p = [this](int y) { return this-&gt;onEvent(y); }; 但包含更多的语法噪音 IMO。
【解决方案2】:

你需要绑定它:

 boost::bind(&ClassX::member_function, boost::ref(instance))

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 2013-05-07
    • 2015-06-15
    • 2010-12-27
    • 2023-03-15
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多