【问题标题】:using boost::function to save function pointer to arbitrary object's member functions使用 boost::function 将函数指针保存到任意对象的成员函数
【发布时间】:2013-06-06 10:52:06
【问题描述】:

我试图从一个对象中存储一个成员函数,以便在适当的事件发生时调用它。不幸的是,这段代码给出了很多错误信息。有谁能够帮我?

class MainPage
{
public:

    MainPage::MainPage(void)
    {
        image1 = new STImagePanel("Untitled.png");
        image1->OnPointerPressedHandler->add(&MainPage::imageMousePressed,this);
    }

    void MainPage::imageMousePressed(STObject* sender, STPointerEventArg * args)
    {
        MainPage * dsda = (MainPage*)this;
        pres = true;
    }

};


template<class SENDERTYPE, class ARG>
struct callbackInfo
{
    boost::function<void(SENDERTYPE, ARG)> func;
};

template<class SENDERTYPE, class ARG>
class STEventHandler
{
public:
    template<class T, class P>
    void add(T x, P that)
    {
        //The following line gives the error
        callbackInfo<SENDERTYPE,ARG> tmp { boost::bind(x,that,_2)};  
        functions->addLast(tmp);
    }

private:
    STLinkedList<callbackInfo<SENDERTYPE,ARG>>* functions;
}

这会产生以下错误:

http://pastie.org/8014181

更新: 通过以下更正,它可以正常工作:

template<class T, class P>
void add(T x, P that)
{
    boost::function<void(SENDERTYPE,ARG)> func(boost::bind(x,that,_1,_2));
    callbackInfo<SENDERTYPE,ARG> tmp;
    tmp.func = func;
}

【问题讨论】:

    标签: c++ boost boost-bind boost-function


    【解决方案1】:

    我看到MainPage::imageMousePressed(STObject* sender, STPointerEventArg * args) 的一个问题有两个参数,但是在对boost::bind 的调用中,您只是将_2 绑定到发件人。那是行不通的。您必须同时绑定两者,或者传递 NULL 或一些标记值。

    更一般地说,在我看来,你正在重塑 boost::signals

    【讨论】:

    • 谢谢。我试过这条线,但这仍然不起作用。 callbackInfo tmp{ boost::bind(x,that,_1,_2)};
    【解决方案2】:

    两个建议:

    1) 在您未显示第一条错误消息的代码中,可能阻止了某些标头包含;

    2) 您在类 MainPage 定义的末尾缺少分号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      相关资源
      最近更新 更多