LINUX.ORG.RU

История изменений

Исправление mkam, (текущая версия) :

Что-нибудь типа такого.

class TaskBase {
  using Callback = void (*)(TaskBase* self, bool execute);

 public:
  void Complete() { callback_(this, true); }
  void Destroy() { callback_(this, false); }

 protected:
  TaskBase(Callback callback) : callback_{callback} {}

 private:
  Callback callback_;
};

template <typename Handler>
class Task : public TaskBase {
 public:
  template <typename Fn>
  Task(Fn&& fn) : TaskBase(DoCall), fn_{std::forward<Fn>(fn)} {}

 private:
  static void DoCall(TaskBase* base, bool execute) {
    auto* self = static_cast<Task*>(base);
    /* impl */
  }

 private:
  Handler fn_;
};

TaskBase можно еще сделать членом интрузивного списка.
А вообще можно boost.asio посмотреть по данному поводу. Не могу сходу найти нужное место в исходниках.

Исходная версия mkam, :

Что-нибудь типа такого.

class TaskBase {
  using Callback = void (*)(TaskBase* self, bool execute);

 public:
  void Complete() { callback_(this, true); }
  void Destroy() { callback_(this, false); }

 protected:
  TaskBase(Callback callback) : callback_{callback} {}

 private:
  Callback callback_;
};

template <typename Handler>
class Task : public TaskBase {
 public:
  template <typename Fn>
  Task(Fn&& fn) : TaskBase(DoCall), fn_{std::forward<Fn>(fn)} {}

 private:
  static void DoCall(TaskBase* base, bool execute) {
    auto* self = static_cast<Task*>(base);
    /* impl */
  }

 private:
  Handler fn_;
};


TaskBase можно еще сделать членом интрузивного списка.
А вообще можно boost.asio посмотреть по данному поводу. Не могу сходу найти нужное место в исходниках.