发送方法作为参数

时间:2019-09-30 20:41:24

标签: c++ class methods std-function

我只是不使用std :: bind就无法找到调用类方法的方法,因为我需要在tryfoo中使用参数调用该方法。

//simple function  
uint16_t getreg(const uint8_t& num)  
{  
    return 0;  
}  

让我们假设在ClassItem类中我们有公共方法

uint16_t ClassItem::getregI(const uint8_t &f)  
{  
    return 1;  
}  

具有可调用功能的功能

void tryfoo (const uint8_t &param, std::function<uint16_t (const uint8_t&)> f)  
{  
// let's suppose that param= got some other value here  
    uint16_t result = f(param);  
}  

void basefunction(ClassItem &A)  
{  
   tryfoo (0, getreg); // Why it's OK  
   tryfoo (0, A.getregI) // And this's NOT  ?
}

1 个答案:

答案 0 :(得分:0)

这是因为std::function保留了一个指针*的空间,而没有其他任何空间。仅传递一个普通函数是可能的,因为它适合一个指针的空间。对于对象中的成员函数,这是不可能的,因为您必须同时存储指向该函数的指针和指向该对象的指针,并且您不能将两个指针放入一个指针的空间中(至少,不安全)。

因此,您必须使用std::bind构建一个单独的对象,然后将指针传递给该对象。您可以将指针传递给成员函数,而不必像tryfoo (0, ClassItem::getregI);那样绑定到对象,但是将无法访问A对象。

*:这方面的细节很模糊,但总的来说仍然成立。