LINUX.ORG.RU

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

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

Всё равно ничего не понял. Мне кажется ты перемудрил. Type erasure делается через std::function.

auto task = [/*захват состояния*/]() { /* любой код */ };

void process(const std::function<void()> &task)
{
    task(); // Любой код можно вызвать не зная ничего о нём. Только функтор.
}
// Или даже так, чтобы было оптимальнее
template<typename T>
void process(T &&task)
{
    task();
}

Но нужно понимать, что std::function жирные. Хотя я лучше бы на твоём месте излишни не теоретизировал, а попробовал написать. Может быть со скоростью будет всё в порядке даже с жирными фанкшинами.

delete (MyAlgorithmState*) state;

Не забывай про виртуальный деструктор в классе интерфейсе. А то нормально не удалит.

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

Всё равно ничего не понял. Мне кажется ты перемудрил. Type erasure делается через std::function.

auto task = [/*захват состояния*/]() { /* любой код */ };

void process(const std::function<void()> &task)
{
    task(); // Любой код можно вызвать не зная ничего о нём. Только функтор.
}
// Или даже так, чтобы было оптимальнее
template<typename T>
void process(T &&task)
{
    task();
}

delete (MyAlgorithmState*) state;

Не забывай про виртуальный деструктор в классе интерфейсе. А то нормально не удалит.