使用Boost函数作为调用不同成员函数的类数据成员

时间:2016-07-13 17:12:59

标签: c++ boost

这是来自更大代码的玩具示例。要点是,我试图根据一些输入参数制作一个提升功能。但是,以下编译失败,并显示错误消息no match for call to boost::function<void()> candidate expects 0 arguments, 1 provided.

HPP:

class SillyClass
{
public:
    SillyClass();
    void sillyFunc1();
    void sillyFunc2();    
    void setUp(bool );

private:
    boost::function<void ()> m_function;
};

CPP

SillyClass::SillyClass() : m_function()
{
}

void SillyClass::setUp(bool p_in)
{
    if (p_in)
    {
        m_function ( boost::bind(&SillyClass::sillyFunc1, this) );
    }
    else
    {
        m_function ( boost::bind(&SillyClass::sillyFunc2, this) );
    }
}

void SillyClass::sillyFunc1()
{
    std::cout << "Silly" << std::endl;
}

void SillyClass::sillyFunc2()
{
    std::cout << "Not Silly" << std::endl;
}

我知道这需要this甚至有机会工作。如果我将分配函数的行更改为:

boost::function<void ()> f(boost::bind(&SillyClass::sillyFunc2, this));
m_function = f;

这个编译得很好。这是我第一次尝试将boost功能用于此类事情,所以我确信我必须忽视某些事情。但是,文档似乎没有提到为什么无法编译。有人能向我指出我所缺少的东西吗?

1 个答案:

答案 0 :(得分:1)

您在构造函数的member-initializer-list和正常赋值中混淆了初始化语法。这样:

m_function ( boost::bind(&SillyClass::sillyFunc1, this) );

使用单个参数调用 m_function。但是m_function的{​​{1}}不接受任何参数,因此错误(调用operator()不匹配,候选人需要 0参数< /强>)。你想要分配它:

boost::function<void()>

应该可以正常工作。