标签: rtti

什么是C++最简单的RTTI实现?

我正在尝试为嵌入式操作系统实现异常处理,而我却坚持如何检测抛出的"异常"的类型(以选择适当的处理程序).

异常处理的保存和恢复上下文部分已经完成,但由于无法检测抛出的"异常"的类型,因此无法使用特定的句柄.c ++的标准RTTI实现太依赖于其他库,因此我目前认为它不可用.

考虑到我的目标是一个嵌入式系统,因此我无法创建太多代码,我可以获得(或制作)的"运行时类型信息"的最小实现是什么?

- 编辑 -

我不是在编译器,它是一个ia32-g ++.

c++ exception-handling rtti

8
推荐指数
1
解决办法
4246
查看次数

在C++中混合使用RTTI标志

如果我有多个挂在C++ C++静态链接库,是他们有可能共享(传入和传出函数)类的对象,如果他们在编译时使用不同的启用/禁用运行时类型信息(RTTI)值?

--edit:感谢您的回复,我担心的具体事情是1.启用RTTI是否会改变sizeof对静态(非多态类型)的行为?

2,如果我在启用RTTI的库中创建一个类并将其传递给另一个非RTTI启用的库,虚拟方法是否正常工作.(反之亦然)

,最后如果我在启用RTTI库中创建一个类,我希望能够用dynamic_cast的它,如果我通过那个对象非RTTI启用库,我仍然可以使用它在那个对象.......我不会这样认为,无论如何这似乎是一个坏主意......我只是好奇.

c++ rtti

8
推荐指数
1
解决办法
2315
查看次数

枚举实现给定接口的所有Delphi类?

使用Delphi 2010中的新扩展RTTI,Delphi应用程序(在运行时)是否可以构建实现给定接口的所有类的列表?

delphi interface rtti delphi-2010 delphi-xe

8
推荐指数
1
解决办法
1463
查看次数

C++ 11是否为std :: type_info提供散列函数?

我仍在努力为我的One-A型容器问题提供一个很好的解决方案- 经过反思,我认为能够使用类似的东西会很好std::map<std::type_info, boost::any>.不幸的是,std::type_info没有定义一个operator<,我认为它定义一个是不合理的.

但是,为它定义哈希函数似乎是合理的,因为您可以简单地将std::type_info对象的单个地址用作合理的"哈希".因此,您可以将std::type_infoa std::unordered_map作为键.

C++ 11是否提供了这样的哈希函数?使用std::type_info单例的内存地址会是一个错误的哈希策略吗?

c++ unordered-map rtti typeinfo c++11

8
推荐指数
2
解决办法
4637
查看次数

Delphi:在运行时查找从给定基类下降的类?

是否正在运行时,查找从特定基类下降的所有类?

例如,假装有一个类:

TLocalization = class(TObject)
...
public
   function GetLanguageName: string;
end;
Run Code Online (Sandbox Code Playgroud)

或者假装有一堂课:

TTestCase = class(TObject)
...
public
   procedure Run; virtual;
end;
Run Code Online (Sandbox Code Playgroud)

或者假装有一堂课:

TPlugIn = class(TObject)
...
public
   procedure Execute; virtual;
end;
Run Code Online (Sandbox Code Playgroud)

或者假装有一堂课:

TTheClassImInterestedIn = class(TObject)
...
public
   procedure Something;
end;
Run Code Online (Sandbox Code Playgroud)

在运行时,我想找到所有下降的类,TTestCase以便我可以使用它们.

是否可以查询RTTI以获取此类信息?

或者:德尔福有没有办法让每个班级走路?然后我可以简单地打电话:

RunClass: TClass;

if (RunClass is TTestCase) then
begin
   TTestCase(RunClass).Something;
end;
Run Code Online (Sandbox Code Playgroud)

也可以看看

delphi rtti delphi-5

8
推荐指数
2
解决办法
5518
查看次数

Delphi:是否可以在全局命名空间中枚举记录的所有实例(~typed常量)?

从研究,我已经做了,到目前为止,我已经猜的答案是否定的,但只是为了确保...(也,此内容可以更新一次支持这可用).

我认为问题标题应该已经自给自足,但我想要做的是FWIW:我有一个围绕记录常量构建的配置框架:我的应用程序中可用的每个配置选项都在表单的中心位置定义类型化常量,包含注册表(或INI)键的名称,其数据类型及其默认值.这些常量是我传递给我的框架中的访问器方法,然后实现检索和存储选项值的必要逻辑.

我现在想扩展这些记录中的信息,还包括可用于自动生成ifdef描述这些选项的ADM/ADMX文件(在发布版本中编辑)的元数据.

但为此,我需要能够枚举这些常量,除非我添加某种显式注册机制,这似乎是不必要的重复.

理想情况下,我不想在记录类型中添加额外的字段,而是希望以属性的形式声明元信息,但那些(但是?)不能应用于常量.此外,这不会改变任何关于首先枚举常量的必要性.

假设目前通过RTTI无法做到这一点,我可能会考虑将元数据放入注释中并以某种方式解析出来.这可能是另一个问题.

[平台信息:目前正在使用Delphi 2010,但我已经拥有XE许可证 - 只是没有时间安装它,但是]

delphi record rtti

8
推荐指数
1
解决办法
583
查看次数

如何获取内存中对象的数据集?

有谁知道一个TDataSet的后裔,与泛型和RTTI的作品,让我可以写这样的代码,并利用数据感知组件的GUI的?:

...
ds:TDataset<TPerson>;
...

procedure DoStuff;
begin    
  ds:=TDataset<TPerson>.create;
  ds.add(TPerson.Create('A.','Hitler',77));
  ds.add(TPerson.Create('O.','Bin Laden',88));
 end; 
Run Code Online (Sandbox Code Playgroud)

应该是可能的.fielddef可以通过RTTI创建,因为已知数据的确切类型.值也可以来回自动编组,因此您可以查看和编辑类或记录中的数据.

我讨厌必须编写大量无用的编组代码,而已经通过RTTI获得所需的信息.

或者有人曾经写过某种TEnumerable < - > TDataset适配器?

这样的事情是存在的,还是我应该开始写一个?

...

我能找到的最接近的东西是来自Mastering Delphi 7的Marco Cantu的一个(优秀的!)示例,但是代码本身并没有使用泛型,新RTTI系统或属性等新语言功能,而且它没有使用Unicode delphi.自D7以来,TDataset也发生了变化.

delphi generics rtti data-aware tdataset

8
推荐指数
1
解决办法
3903
查看次数

使用-fno-rtti编译的共享库中的子类

我试图从使用-fno-rtti编译的共享库中继承子类.不幸的是,我的代码库中的其他库需要-frtti.结果我得到链接错误,因为超类没有typeinfo结构.

正常编译中收到错误:

out.o: in function typeinfo for MyClass:myclass.cpp(.data.rel.ro.<cpp magic>): error: undefined reference to 'typeinfo for NetlinkListener'
Run Code Online (Sandbox Code Playgroud)

我想要子类的类是libsysutils中的一个android类(为空间剪掉一点):

class NetlinkListener : public SocketListener {
    char mBuffer[64 * 1024];
    int mFormat;

public:
    static const int NETLINK_FORMAT_ASCII = 0;
    static const int NETLINK_FORMAT_BINARY = 1;

    NetlinkListener(int socket);
    NetlinkListener(int socket, int format);
    virtual ~NetlinkListener() {}

protected:
    virtual bool onDataAvailable(SocketClient *cli);
    virtual void onEvent(NetlinkEvent *evt) = 0;
};
Run Code Online (Sandbox Code Playgroud)

我的存根看起来像:

class MyClass: public NetlinkListener {

public:
    MyClass();
    virtual ~MyClass();

    int start();
    int stop();

protected:
    virtual void …
Run Code Online (Sandbox Code Playgroud)

c++ subclass rtti

8
推荐指数
1
解决办法
1608
查看次数

为什么dynamic_cast是邪恶的?在这种情况下我应该使用dynamic_cast吗?

有人说 the use of dynamic_cast often means bad design and dynamic_cast can be replaced by virtual functions

  1. 为什么使用被dynamic_cast认为是糟糕的设计?
  2. 假设我有函数名func(Animal* animal, int animalType),func中的实现如下:

    bool func(Animal* animal, int animalType)
    {
      ...
      /* Animal is the base class of Bear, Panda, Fish ....
      dynamic_cast animal to real animals(Bear, Panda, Fish...) 
      according to animalType. Do some processing with this specific
      type of animal, using its additional information beyond base 
      class Animal. */
    }
    
    Run Code Online (Sandbox Code Playgroud)

这种情况是否正确使用dynamic_cast

c++ dynamic-cast rtti

8
推荐指数
1
解决办法
6242
查看次数

什么是处理混合类型的存储池的"正确的OOP"方式?

这是受到对我的另一个问题的评论的启发:

在C++中为类提供可访问的"名称"时,您如何"不重复自己"?

nvoight:"RTTI很糟糕,因为它暗示你没有做好OOP.做自己的自制RTTI不会让它更好OOP,它只是意味着你在糟糕的OOP之上重新发明轮子."

那么这里的"优秀OOP"解决方案是什么?问题是这个.该程序是用C++编写的,因此下面还提到了C++特定的细节.我有一个"组件"类(实际上是一个结构),它被子类化为包含不同类型组件数据的许多不同的派生类.它是游戏"实体组件系统"设计的一部分.我想知道组件的存储.特别是,当前的存储系统具有:

  1. "组件管理器",用于存储单个类型组件的数组,实际上是哈希映射.哈希映射允许通过其所属实体的实体ID来查找组件.此组件管理器是从基础继承的模板,模板参数是要管理的组件类型.

  2. 一个完整的存储包,它是这些组件管理器的集合,实现为指向组件管理器基类的指针数组.这有插入和提取实体的方法(插入时,组件被取出并放入管理器,删除时,它们被提取并收集到新的实体对象中),以及添加新组件管理器的方法,所以如果我们想要为游戏添加新的组件类型,我们所要做的就是为其插入一个组件管理器.

这是提示这一点的完整存储包.特别是,它无法访问特定类型的组件.所有组件都存储为基类指针,没有类型信息.我想到的是使用某种RTTI并将组件管理器存储在映射类型名称的映射中,从而允许查找,然后适当地向下转换指向相应派生类的基类指针(用户将调用模板成员)在实体存储池上执行此操作).

但是如果这个RTTI意味着糟糕的OOP,那么设计这个系统的正确方法是什么,所以不需要RTTI?

c++ oop rtti

8
推荐指数
2
解决办法
324
查看次数