Код: Выделить всё
typedef std::function Task;
Task task = [&](void *context) { ClassMemberFunction(context); };
Есть ли лучший /более чистый способ достичь этого? /strong>
У меня есть объект, который должен выполнять задачу в какой -то момент. Вы можете считать это обратным, например, образец .
My Task определяется как функция. Задача должен иметь какой -то контекст для работы в/с.
my Task не возвращает значение, но оно может хранить результаты в контексте.
< P> Я стараюсь сделать это общим, поэтому не имеет значения, какая это задача и какой контекст он требует. < /p>
Я сделал какой -то код (который я проверил Скомпилируйте и запустите) :
Код: Выделить всё
/// ImportantWork.h
#include
// Define the task signature.
typedef std::function Task;
class ImportantWork {
public:
// A function taking a long time, which will be calling the task when the time has come.
void PerfomWorkTakingLongTime(Task task, void *taskContex);
};
< /code>
/// ImportantWork.cpp
#include "ImportantWork.h"
void ImportantWork::PerfomWorkTakingLongTime(Task task, void *taskContex) {
// Do a lot of work.
// Now it is time to call the task.
task(taskContex);
// Perhaps do some more work.
}
< /code>
Now it happens that my task
Код: Выделить всё
/// MyClass.h
#include "ImportantWork.h"
class MyClass {
public:
void StartWork();
private:
void TaskCallback(void *context);
int TaskVariable = 0;
ImportantWork importantWork;
};
< /code>
/// MyClass.cpp
#include "MyClass.h"
void MyClass::StartWork() {
// Start work taking a long time and provide the TaksCallback as task and a reference to the MyClass instance as context.
importantWork.PerfomWorkTakingLongTime(
[&](void *context) { TaskCallback(context); }, // -- My question is about this line. -- //
this);
}
void MyClass::TaskCallback(void *context) {
// Manipulate a MyClass instance member.
TaskVariable += 1; // -- My question is about this line also. -- //
// This does also work. Somehow, I expected this to be the only way.
MyClass *pContext = (MyClass *)context;
pContext->TaskVariable += 1;
}
< /code>
/// Main.cpp
#include "MyClass.h"
int main(void) {
MyClass myInstance;
myInstance.StartWork();
return 0;
}
< /code>
This seems to work, however, I'm puzzled by my lambda expression (see MyClass.cpp): [&](void *context) { TaskCallback(context); }
Код: Выделить всё
[&]
Код: Выделить всё
this
Я понимаю, что функции члена класса требует ссылки на экземпляр класса. Похоже, что компилятор неявно предоставляет это функции как своего рода аргумент «под капотом». Br /> Однако мне кажется, что я удваиваю вещи, предоставляя контекст дважды. Ссылка [&] или copy [=] , просто захватывая ничего, кроме того, что кажется, что это невозможно.
Есть ли хороший способ достичь того, что я ' m Попытка. < /p>
Спасибо. использовать явный контекст. Тем не менее, выражение Lambda захватывает контекст из -за [&] . Можно ли этого избежать? Могу ли я вообще избегать использования выражения лямбды?
Подробнее здесь: https://stackoverflow.com/questions/794 ... onvoidvoid