【问题标题】:How can boost::bind call private methods?boost::bind 如何调用私有方法?
【发布时间】:2011-06-30 16:40:37
【问题描述】:

boost::bind 在许多情况下都非常方便。其中之一是调度/发布一个方法调用,以便 io_service 稍后在可能的情况下进行调用。

在这种情况下,boost::bind 的行为与人们所期待的一样:

#include <boost/asio.hpp>
#include <boost/bind.hpp>

boost::asio::io_service ioService;

class A {
public:     A() {
                // ioService will call B, which is private, how?
                ioService.post(boost::bind(&A::B, this));
            } 
private:    void B() {}
};

void main()
{
    A::A();
    boost::asio::io_service::work work(ioService);
    ioService.run();
}

然而,据我所知,boost 创建了一个仿函数(一个带有 operator()() 的类),能够在给定对象上调用给定方法。该类应该可以访问私有 B 吗?我猜不是。

我在这里错过了什么?

【问题讨论】:

    标签: c++ boost bind functor


    【解决方案1】:

    您可以通过指向成员函数的指针调用任何成员函数,而不管其可访问性如何。如果函数是私有的,那么只有成员和朋友可以创建指向它的指针,但是一旦创建了指针,任何东西都可以使用。

    【讨论】:

    • 对于指向私有静态方法的常规指针也是如此。
    【解决方案2】:

    它通过指向成员函数的指针,boost 调用私有函数。类的成员函数创建指针,并将其传递给 boost,然后 boost 使用该指针调用类对象的私有函数。

    下面是这个基本思想的一个简单说明:

    class A;
    
    typedef void (A::*pf)();
    
    class A 
    {
    public:     
        pf get_ptr() { return &A::B; } //member function creates the pointer
    private:    
        void B() { cout << "called private function" << endl; }
    };
    
    int main() {
            A a;
            pf f = a.get_ptr();
            (a.*f)();
            return 0;
    }
    

    输出:

    调用私有函数

    虽然没有使用boost,但基本思路就是这样。

    请注意,只有成员函数和friend 可以创建指向private 成员函数的指针。其他人无法创建。

    ideone 演示:http://ideone.com/14eUh

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2013-01-23
      • 2015-07-06
      • 2011-05-01
      相关资源
      最近更新 更多