Size: a a a

2020 October 15

IZ

Ilia Zviagin in pro.cxx
Vlad Faust
Там в любом случае будет std::function, который и есть корень проблемы — его нельзя мувать в MSVC
А кто мешает просто его ксопировать?
источник

NP

Nikita Provotorov in pro.cxx
Vlad Faust
Пожалуйста, реализуйте пример. Без комментариев, не форматированный, но чтобы я уже от него отталкивался
на коленке для void() сигнатуры:
struct ITask
{
   virtual void execute() = 0;
};

template<typename Callable>
struct TaskWrapper : ITask
{
   Callable f;

   virtual void execute() override { return (void)f(); }
};
источник

ПК

Побитый Кирпич... in pro.cxx
Vlad Faust
Пожалуйста, реализуйте пример. Без комментариев, не форматированный, но чтобы я уже от него отталкивался
Что то такое:
https://onlinegdb.com/BJMyw2BvP
источник

NP

Nikita Provotorov in pro.cxx
Nikita Provotorov
на коленке для void() сигнатуры:
struct ITask
{
   virtual void execute() = 0;
};

template<typename Callable>
struct TaskWrapper : ITask
{
   Callable f;

   virtual void execute() override { return (void)f(); }
};
а ну да, надо про виртуальный деструктор не забыть ешо
источник

ПК

Побитый Кирпич... in pro.cxx
Не, там всё равно пара ошибок, но я уверен ты их исправишь
источник

ПК

Побитый Кирпич... in pro.cxx
Думаю идея понятна
источник

VF

Vlad Faust in pro.cxx
Сейчас попробую
источник

VF

Vlad Faust in pro.cxx
Справедливо ругается на отсутствие get_future у ITask. А виртуальные функции нельзя делать auto.
источник

VF

Vlad Faust in pro.cxx
Кастовать unuique_ptr<ITask> в указатель на нужный packaged_task<_Ret()>? В чём разница тогда, такой же небезопасный каст
источник

ПК

Побитый Кирпич... in pro.cxx
Vlad Faust
Справедливо ругается на отсутствие get_future у ITask. А виртуальные функции нельзя делать auto.
вызови у конкретного
источник

VF

Vlad Faust in pro.cxx
Да, хорошо, попробую
источник

ПК

Побитый Кирпич... in pro.cxx
Vlad Faust
Кастовать unuique_ptr<ITask> в указатель на нужный packaged_task<_Ret()>? В чём разница тогда, такой же небезопасный каст
ты сначала можешь создать объект таска, затем взять у него футуру и только потом присвоить указателю на интерфейс
источник

ПК

Побитый Кирпич... in pro.cxx
Выбрось из головы все свои идеи с кастами указателей
источник

VF

Vlad Faust in pro.cxx
Побитый Кирпич
ты сначала можешь создать объект таска, затем взять у него футуру и только потом присвоить указателю на интерфейс
Так и сделал, да
источник

VF

Vlad Faust in pro.cxx
https://github.com/vladfaust/thread-pool-msvc-bug/commit/47e099ce33ac53c0b8f0c0adbe3c18caa48220a5 падает со всякими ошибками биндинга. Наверное, я что-то не так сделал
источник

ПК

Побитый Кирпич... in pro.cxx
Vlad Faust
https://github.com/vladfaust/thread-pool-msvc-bug/commit/47e099ce33ac53c0b8f0c0adbe3c18caa48220a5 падает со всякими ошибками биндинга. Наверное, я что-то не так сделал
посмотри внимательно как я таску создаю
источник

ПК

Побитый Кирпич... in pro.cxx
Ты не функцию в таску должен сувать а package_task (или unique_ptr<package_task> если у тебя проблемы с мувами)
источник

VF

Vlad Faust in pro.cxx
Угу
источник

VF

Vlad Faust in pro.cxx
https://github.com/vladfaust/thread-pool-msvc-bug/blob/58ef177e16a6bbb3309ab3030a70ebbc146728fc/thread_pool.hpp#L64-L79 Бла бла because field '_task' has a deleted copy constructor, что ожидаемо
источник

VF

Vlad Faust in pro.cxx
Поправил!
источник