Делегаты типа C# в C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Делегаты типа C# в C++

Сообщение Anonymous »

Я провел небольшое исследование по этому вопросу, но не пришел к конкретному решению. Мне бы очень хотелось это сделать:

public delegate void VoidFloatCallback(float elapsedTime);
public VoidFloatCallback OnEveryUpdate;
public VoidFloatCallback OnNextUpdate;

public virtual void Update(GameTime gameTime)
{
if (OnNextUpdate != null)
{
OnNextUpdate(gameTime);
OnNextUpdate = null;
}

if (OnEveryUpdate != null)
{
OnEveryUpdate(gameTime);
}

this.OnUpdate(gameTime);
}


Но, конечно, на C++. Я нашел только одно решение, которое предоставляет мне такую ​​функцию; но с тех пор он был отключен от сети, но я разместил его здесь http://codepad.org/WIVvFHv0. Единственная проблема с решением, которое я нашел, заключается в том, что оно не является современным кодом C++11 и не имеет поддержки лямбда-выражений.

Я знаю, что смогу использовать

std::function


но единственная проблема в том, что он не поддерживает операторы "+=, -=, ==". Теперь я подумал о создании собственного класса Events и создании

vector


с некоторыми шаблонами, но я обнаружил, что std::function не реализует оператор ==, поэтому я не смог сделать его похожим на C# делает.

В любом случае, мой вопрос заключается в следующем:

Мне хотелось бы знать, как реализовать такую ​​систему событий, используя C++11 — или если это вообще возможно. Или даже если вы знаете лучший/правильный способ реализации обратных вызовов, поддерживающих несколько прослушивателей (я бы хотел избежать полномасштабной реализации шаблона наблюдателя, если это вообще возможно).

Обновление №1

Мои намерения в отношении операторов заключались в следующем:

void some_func(float f) { /** do something with f **/ }
void some_other_func(float f) { /** do something else with f **/ }
OnNextUpdate += some_func();
OnNextUpdate += some_other_func();

OnNextUpdate(5.0f);
// both some_func() and some_other_func() are called

OnNextUpdate -= some_other_func();
OnNextUpdate(5.0f);
// only some_func() is called


Подробнее здесь: https://stackoverflow.com/questions/239 ... gates-in-c
Ответить

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

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

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

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

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