shared_ptr без RTTI?

Я пытаюсь использовать shared_ptr во встроенном проекте, который собран с xc32 1.34 (производная от gcc 4.5.2). В проекте отключен RTTI с -fno-rtti,

#include <memory>

Просто включение заголовка дает мне следующие ошибки:

/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del<_Ty, _Dx>::_Get_deleter(const std::type_info&) const':
In file included from APP/MODULES/LIGHT_MANAGER/LightManager.cpp:13:0:
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1264:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del_alloc<_Ty, _Dx, _Alloc>::_Get_deleter(const std::type_info&) const':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1299:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In function '_Dx* std::tr1::get_deleter(const std::tr1::shared_ptr<_Ty2>&)':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1956:44: error: cannot use typeid with -fno-rtti

Итак, что я хочу знать: это вообще невозможно использовать shared_ptr без RTTI или я что-то не так делаю?

7

Решение

Проблема заключается в get_deleter свободная функция:

template<class D, class T> D* get_deleter(const shared_ptr<T>& p) noexcept;

Возвращает: Если p владеет удалителем d типа резюме-неквалифицированный D, возвращает std:addressof(d); в противном случае возвращается nullptr, Возвращенный указатель остается действительным, пока существует shared_ptr экземпляр, который владеет d,

Очевидно, что самая простая реализация этого заключается в хранении typeid удалителя в блоке управления. Хотя существуют и другие возможные реализации, они будут (а) более сложными, (б) потерять двоичную совместимость с кодом, поддерживающим RTTI, и (в) будут противоречить «духу» -fno-rtti,

Еще одна проблемная функция dynamic_pointer_cast, который вызывает dynamic_cast на сохраненном указателе.

Тем не менее, основной функционал shared_ptr реализуемо без использования функций RTTI, и, как действительно упоминал Сергей Никулов, shared_ptr поставляется с GCC 4.8.5 работает с -fno-rttiза исключением get_deleter а также dynamic_pointer_cast функции; до тех пор, пока вы не используете эти средства, нет никаких причин, по которым вы не сможете их использовать shared_ptr, Это можно сравнить с, например, any, который не может быть реализован без использования typeid,

Ваш поставщик обязан предоставить стандартную библиотеку, которая работает во всех конфигурациях своего компилятора, включая нестандартные, если они поддерживают их использование. Однако, если ваш поставщик не сотрудничает, у вас все еще есть несколько вариантов:

  • Патч поставляемой стандартной библиотеки для удаления сломанной get_deleter код;
  • Используйте альтернативную стандартную библиотеку (например, более позднюю версию libstdc ++ или libc ++);
  • Используйте альтернативное средство умного указателя (например, Boost) или напишите его самостоятельно.
8

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

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

По вопросам рекламы [email protected]