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

Use Boost Function as a Class Data Member for Calling Different Member Functions

本文关键字:函数 调用 成员 数据成员 Boost 使用      更新时间:2023-10-16
这是一个

来自更大代码段的玩具示例。 要点是,我正在尝试根据某些输入参数制作一个提升函数。但是,以下内容无法编译,并显示错误消息,no match for call to boost::function<void()> candidate expects 0 arguments, 1 provided.

马力:

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;

这编译得很好。这是我第一次尝试使用增强功能来做这种事情,所以我相信我一定忽略了什么。但是,文档似乎没有提到为什么无法编译。有人可以向我指出我缺少什么吗?

您混淆了构造函数和正常赋值的成员初始值设定项列表中的初始化语法。这:

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

使用单个参数调用m_function。但是m_functionoperator()不接受任何参数,因此错误(与调用boost::function<void()>不匹配,候选人期望0个参数)。相反,您希望分配它:

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

这应该可以正常工作。