Можно ли избежать накладных расходов при использовании boost_any?

Я хотел бы использовать boost::any как универсальный тип для хранения в контейнере и для перехода к различным функциям. Но внутри этих функций я всегда знаю реальный тип, поэтому во время выполнения мне не нужны никакие проверки безопасности типов и накладные расходы, static_cast достаточно.

Идеальным решением было бы использовать что-то вроде boost::polymorphic_downcast, но, как я вижу, это не может быть применено в этом случае.

Должен ли я просто написать свою собственную обертку для void* или есть другой вариант?

2

Решение

Вы можете использовать shared_ptr<void> или unique_ptr с static_cast заменить boost::any, shared_ptr<void> имеет несколько преимуществ перед сырьем void* указатель как:

  • автоматически удалить свое хранилище
  • может ссылаться на несколько объектов в вашем коде (может быть, вам это не нужно)

Но, конечно, в этом случае вам нужно больше памяти для каждого указателя (для подсчета и удаления ссылок).

если совместное использование не подходит для вас и ваш объект будет принадлежать только в контейнере, вы также можете использовать unique_ptr<void>,

1

Другие решения

Других решений пока нет …