Есть ли более элегантный способ отменить удаление типа с помощью «сохраненного» типа с помощью c ++ 17 / c ++ 20? - PullRequest
0 голосов
/ 23 апреля 2020

Пожалуйста, рассмотрите следующий фрагмент кода:

#include <iostream>

template <typename T>
class SaveType {
 public:
  T* allocate() const { return new T; }
  T* cast(void* obj) const { return static_cast<T*>(obj); }
};

int main() {
  int i = 4;
  // "save" the type of the object i in SType:
  SaveType<decltype(i)> SType;

  // do type erasure
  void* z = static_cast<void*>(&i);
  // do stuff with z ...

  // undo type erasure only with the help of SType
  decltype(SType.allocate()) h = SType.cast(z);
  std::cout << *h << std::endl;
}

Приведенный выше код компилируется и работает нормально, как вы можете посмотреть онлайн на Godbolt . Но код выглядит довольно неуклюжим. Есть ли лучшее решение для удаления типов, доступное в c ++ 17 или c ++ 20?

1 Ответ

1 голос
/ 26 апреля 2020

Забавно, что вы должны спросить на этой неделе, потому что я случайно прочитал статью, написанную в 2015 году о "стирании типа удаления" .

В нем предлагается универсальный c интерфейс для классов, которые обертывают что-то вроде void*, поддерживая современное использование C ++ с категориями const-correctness и lvalue / rvalue. Вы можете попробовать, если вы реализуете свое собственное стирание типов.

Что касается классов стирания, они обычно работают лучше, чем ваш простой код, но сложно получить 100% верно, как вы нашли. Классы типа any, variant и function обычно выполняют свою работу, но с некоторыми грубыми краями. Вот что побудило меня написать статью, но мотивировать других принять ее - это другое дело!

...