Присвоение функции члена класса с переменной типа std :: function C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Присвоение функции члена класса с переменной типа std :: function

Сообщение Anonymous »

Я относительно новичок в C ++, пожалуйста, простите некоторые недостатки в моей формулировке. В основном у меня есть функция члена класса и переменная типа std :: function . Я хочу назначить свою функцию члена класса этой переменной.

Код: Выделить всё

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); }
. захватывает мой класс () неявно как контекст. Тем не менее, одна строка ниже, я явно предоставляю контекст, как это .
Я понимаю, что функции члена класса требует ссылки на экземпляр класса. Похоже, что компилятор неявно предоставляет это функции как своего рода аргумент «под капотом». Br /> Однако мне кажется, что я удваиваю вещи, предоставляя контекст дважды. Ссылка [&] или copy [=] , просто захватывая ничего, кроме того, что кажется, что это невозможно.
Есть ли хороший способ достичь того, что я ' m Попытка. < /p>
Спасибо. использовать явный контекст. Тем не менее, выражение Lambda захватывает контекст из -за [&] . Можно ли этого избежать? Могу ли я вообще избегать использования выражения лямбды?

Подробнее здесь: https://stackoverflow.com/questions/794 ... onvoidvoid
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему С++ не различает параметры std::function и std::function()>?
    Anonymous » » в форуме C++
    0 Ответы
    95 Просмотры
    Последнее сообщение Anonymous
  • Почему С++ не различает параметры std::function и std::function()>?
    Anonymous » » в форуме C++
    0 Ответы
    89 Просмотры
    Последнее сообщение Anonymous
  • Как заставить компилятор С++ различать параметры std::function и std::function()>?
    Anonymous » » в форуме C++
    0 Ответы
    75 Просмотры
    Последнее сообщение Anonymous
  • Основы функции - Function Function Function, пройдя в INTS больше 99
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Основы функции - Function Function Function, выходящая из INT, более 99 [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»