Size: a a a

2020 December 14

А

Алехан in pro.cxx
О ничего себе)
источник

А

Алехан in pro.cxx
Спасибо!
источник

IZ

Ilia Zviagin in pro.cxx
Алехан
О ничего себе)
Это канал...
источник

А

Алехан in pro.cxx
Ilia Zviagin
Это канал...
К нему и чатик нашёлся :3
источник

A

Alex in pro.cxx
Можно ли делать type erasure через двойное наследование? Вот таким образом:

struct DummyBaseType {
 virtual ~DummyBaseType() = default;
};

struct ConcreteType final : public std::function<void(Arguments...)>, DummyBaseType {
};

std::unique_ptr<DummyBaseType> f() {
  return std::make_unique<ConcreteType>();
}
источник

A

Alex in pro.cxx
изначально хотел сделать просто unique_ptr<void>, но компилятор мне быстро объяснил, что такой тип нельзя удалить. А писать полноценную обёртку на std::function только ради того, чтобы унаследовать её от своего базового класса, не хочется.
источник

NP

Nikita Provotorov in pro.cxx
Alex
Можно ли делать type erasure через двойное наследование? Вот таким образом:

struct DummyBaseType {
 virtual ~DummyBaseType() = default;
};

struct ConcreteType final : public std::function<void(Arguments...)>, DummyBaseType {
};

std::unique_ptr<DummyBaseType> f() {
  return std::make_unique<ConcreteType>();
}
а точно std function надо?
источник

A

Alex in pro.cxx
точно
источник

NP

Nikita Provotorov in pro.cxx
кажется, тут можно хранить голый функтор в наследнике
источник

A

Alex in pro.cxx
а может, хватит и собственной invokable обёртки, но это уже детали, вопрос о подходе
источник

A

Alex in pro.cxx
да, похоже, что можно
источник

АК

Александр Караев... in pro.cxx
Alex
изначально хотел сделать просто unique_ptr<void>, но компилятор мне быстро объяснил, что такой тип нельзя удалить. А писать полноценную обёртку на std::function только ради того, чтобы унаследовать её от своего базового класса, не хочется.
"полноценная обертка над std::function" - это один оператор?
источник

A

Alex in pro.cxx
да)
источник

A

Alex in pro.cxx
и конструктор
источник

A

Alex in pro.cxx
не хочется плодить лишние уровни колл стека. В std::function я не попаду отладчиком благодаря /JMC, а вот в обёртку попаду
источник

NP

Nikita Provotorov in pro.cxx
Alex
да, похоже, что можно
это я к тому что тогда отпадает вопрос о множественном наследовании
источник

A

Alex in pro.cxx
не отпадает, потому что мне интересно, корректный ли это подход
источник

ID

In Dev in pro.cxx
Alex
не отпадает, потому что мне интересно, корректный ли это подход
Если я не ошибаюсь, operator() вы в таком случае не позовете, потому что DummyBaseType его не имеет
источник

A

Alex in pro.cxx
а я перед вызовом сделаю каст к std::function*, потому что в месте вызова я знаю полный тип, но не знаю его в месте удаления этого объекта
источник

АК

Александр Караев... in pro.cxx
Alex
изначально хотел сделать просто unique_ptr<void>, но компилятор мне быстро объяснил, что такой тип нельзя удалить. А писать полноценную обёртку на std::function только ради того, чтобы унаследовать её от своего базового класса, не хочется.
вообще, unique_ptr<void, Deleter> проще в данном случае, имхо
источник