- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试在使用 xc32 1.34(gcc 4.5.2 的衍生物)构建的嵌入式项目中使用 shared_ptr
。该项目使用 -fno-rtti
禁用了 RTTI。
#include <memory>
仅包含 header 会出现以下错误:
/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
所以我想知道的是:如果没有 RTTI,通常不可能使用 shared_ptr
,还是我做错了什么?
最佳答案
问题是 get_deleter
自由函数:
template<class D, class T> D* get_deleter(const shared_ptr<T>& p) noexcept;
Returns: If
p
owns a deleterd
of type cv-unqualifiedD
, returnsstd:addressof(d)
; otherwise returnsnullptr
. The returned pointer remains valid as long as there exists ashared_ptr
instance that ownsd
.
显然,最直接的实现是将删除器的 typeid
存储在控制 block 中。虽然还有其他可能的实现,但它们会 (a) 更复杂,(b) 失去与启用 RTTI 的代码的二进制兼容性,以及 (c) 违背 -fno-rtti
的“精神”。
另一个有问题的函数是 dynamic_pointer_cast
,它在存储的指针上调用 dynamic_cast
。
但是,shared_ptr
的主要功能可以在不使用 RTTI 功能的情况下实现,而且正如 Sergei Nikulov 上面提到的那样,gcc 4.8.5 附带的 shared_ptr
可以正常工作使用 -fno-rtti
,get_deleter
和 dynamic_pointer_cast
函数除外;只要您不使用这些功能,就没有理由不能使用 shared_ptr
。这可以与例如对比any
,如果不使用 typeid
是无法实现的。
您的供应商有责任提供适用于其编译器所有配置的标准库,包括支持其使用的非标准库。但是,如果您的供应商不合作,您仍然有几个选择:
get_deleter
代码;关于c++ - 没有 RTTI 的 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180899/
我需要能够从非 RTTI 代码派生一个类到 RTTI 代码项目中。我正在使用 LLVM,它在代码中禁用了 RTTI。我知道我不能对他们的代码执行 typeinfo 和 dynamic_cast,这没关
我有一个解决方案来构建一个在其项目属性中启用运行时类型信息的 DLL。这是 Visual Studio 2005 中的默认值 (/GR)。在我们的库中,我们有很多 dynamic_cast,因此我目前
我正在尝试使用 boost 序列化来序列化具有 Plain-old-Data 类型的简单类。但是,我唯一的要求是不能使用 RTTI。因此,我正在使用 gcc 4.4.1 for ARM Linux 和
我在我的测试应用程序中使用了一些 LLVM 静态库和 boost::program_options。问题是使用 LLVM 库的源代码应该用 -fno-rtti 编译(llvm-config -cxxf
我的功能模块在运行时接收一个表名和一个列名。 我想获取列的长度:透明表中允许有多少个字符? 我用我最喜欢的搜索引擎找到了RTTS . 但是文档中的示例将变量传递给 RTTS 方法 DESCRIBE_B
我想知道如何在 C++Builder 2010 中使用 TRttiMethod 类的 Invoke 方法。 这是我的代码 Tpp *instance=new Tpp(this); TValue *ar
假设我有: type TClassA = class function prova: integer; virtual; function provaSuA: integer; virtua
我尝试使用 Delphi 2010 编写一种对象/记录序列化程序,并想知道是否有一种方法可以检测记录是否是变体记录。例如。 Types.pas 中定义的 TRect 记录: TRect = recor
我有这样的类(class) TuserClass = class private FUtilisateurCode: string; FUtilisateurCle: string; public
给定一个包含类型名称的文本字符串,是否有某种方法可以获取适当的类型本身? 我想做这样的事情: type TSomeType = class // yadda yadda end; pr
不允许使用此代码: class constructor TOmniMultiPipelineStage.Create; var RTTIType: TRttiType; begin RTTIT
我在使用 rtti 获取有关泛型类型的类字段的信息时遇到问题。经过一番谷歌搜索后,我在 QC 中找到了一个条目描述问题。我的问题是,是否有人知道解决方法,或者是否已修复 Delphi XE2。以下是
正如Rtti data manipulation and consistency in Delphi 2010中已经讨论的那样可以通过使用一对 TRttiField 和实例指针访问成员来达到原始数据和
我想使用 RTTI 在设计时而不是运行时检查项目源文件中包含的类型。 据我所知,这是不受支持的,但 this question 评论中的讨论表明这是可能的,并且已经用于多个 Delphi 版本。这是我
如何在 delphi (XE4) 中通过 Rtti 释放对象的字段? 我需要动态释放所有字段 我可以找到字段,但我现在不知道如何释放它们: destructor TKnBase.Destroy; va
我制作了一个非常通用的单元,其中的设置对象都是 TObject,我不想使用任何单元,这就是我这样做的原因。所以我的做法是使用RTTI来调用一切。但现在我面临一个问题,我可以调用所有函数并给出参数和所有
RTTI 被认为是糟糕设计的原因是什么? Stroustrup 在他的书 TC++PL 中写道,最常见的使用 RTTI 技术的情况是使用 switch 指令,当人们想要根据传递对象的“真实”类型来决定
我看到了一些关于避免 RTTI 的问题,但我的问题似乎更具体一些。这是一个示例案例: struct Base {}; struct A : Base {}; struct B : Base {}; s
我一直在寻找一种方法来解决动态转换类型检查的缓慢问题。在你开始说我应该重新设计一切之前,让我告诉你,设计是 5 年前决定的。我无法修复之后的所有 400,000 行代码(我希望我可以),但我可以进行一
我在 MS Visual Studio Express 2012 中编写了这段代码以查看 rtti 行为。 但它没有按预期工作。 我的代码有什么问题? Shape.h class Shape { pu
我是一名优秀的程序员,十分优秀!