В моем текущем проекте я пытаюсь передать приватную функцию-член в качестве параметра другой функции. В моем коде другая функция является функцией-членом другого класса, но для простоты здесь это свободная функция.
void outside_function(std::function<void(int)> func) {
// do something with func
}
class MyClass {
public:
void run();
private:
bool my_func(double); // defined in source file
};
Теперь изнутри run
Я хочу поместить my_func
в outside_function
в качестве аргумента. Поскольку подпись run
не соответствует требованиям для параметра, я не могу просто передать ее. Использование шаблона адаптера было моей первой попыткой, когда мне напомнили, что функции-члены неявно принимают указатель this
в качестве первого аргумента. Этот ответ предполагает использование лямбда-выражения, что я и сделал.
void MyClass::run() {
outside_function([this](int a) -> void {
double d = static_cast<double>(a);
this->my_func(d);
});
}
Почему это работает? С моей точки зрения, outside_function
не имеет доступа к my_func
. Почему я не должен сначала сделать публичным my_func
? Это то, что делает компилятор, или какое-то правило C ++, которого я не знаю?
Кроме того, есть ли какие-то уловки в этом подходе, которые могут нарушить мой код?