Отправить метод в качестве параметра - PullRequest
0 голосов
/ 30 сентября 2019

Я просто не могу найти способ вызова методов класса без использования std :: bind, потому что мне нужно вызывать этот метод с параметром внутри tryfoo.

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

Предположим, что вclass 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 голосов
/ 30 сентября 2019

Это потому, что std::function содержит место для одного указателя * и ничего больше. Передача простой функции возможна, потому что она помещается в пространство одного указателя. Это невозможно с функцией-членом от объекта, потому что вы должны хранить как указатель на функцию, так и указатель на объект, и вы просто не можете поместить два указателя в пространство одного указателя (по крайней мере,не безопасно).

Таким образом, вы должны создать отдельный объект с std::bind и передать указатель на него. Вы можете просто передать указатель на функцию-член без привязки к объекту, например tryfoo (0, ClassItem::getregI);, но это не будет иметь доступа к объекту A.

*: подробности по этому вопросу нечеткие, но общая точка зрения остается неизменной.

...