История изменений
Исправление 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 посмотреть по данному поводу. Не могу сходу найти нужное место в исходниках.