使用绑定成员函数

时间:2013-09-11 11:46:18

标签: c++ c++11

为什么两个bind版本都在编译和工作没有问题,即使我在每个调用中使用不同的参数类型?

  1. 版本1 - >参数foo vs.
  2. 版本2 - > foo的参数地址
  3. 我期望版本1产生编译错误......


    #include <iostream>
    #include <functional>
    
    using namespace std;
    
    class Test   
    {   
    public:
       bool doSomething(){ std::cout << "xxx"; return true;};   
    };
    
    int main() {
    
    Test foo;
    
    // Version 1 using foo
    std::function<bool(void)> testFct = std::bind(&Test::doSomething, foo);
    
    // Version 2 using &foo
    std::function<bool(void)> testFct2 = std::bind(&Test::doSomething, &foo);
    
    testFct();
    testFct2();
    
    return 0;
    }
    

1 个答案:

答案 0 :(得分:1)

std::function<bool(void)> testFct = std::bind(&Test::doSomething, foo);

这将绑定到foo副本,并将该函数称为copy.doSomething()。请注意,如果您希望在foo本身上调用该函数,则会出错。

std::function<bool(void)> testFct2 = std::bind(&Test::doSomething, &foo);

这将绑定到指针foo并将该函数调用为pointer->doSomething()。请注意,如果在调用函数之前foo已被销毁,则会出错。

  

我期望版本1产生编译错误......

如果您愿意,可以通过使Test不可复制来禁止此行为。