标签: rtti

C++中的RTTI和可移植性

如果编译器不"支持"RTTI,那是否意味着编译器无法处理其中包含虚函数的类层次结构?或者我是否误解了关于RTTI如何不便携的文献,问题出在其他地方?

谢谢大家的意见!

c++ portability rtti

3
推荐指数
2
解决办法
2487
查看次数

isMemberOfClass vs比较类与==

以下是否有任何真正的区别:

id value;
BOOL compare1 = [value isMemberOfClass:[SomeClass class]];
BOOL compare2 = [value class] == [SomeClass class];
Run Code Online (Sandbox Code Playgroud)

检查是否value是一个SomeClass对象?

cocoa dynamic-cast class objective-c rtti

3
推荐指数
1
解决办法
1235
查看次数

C++将一个基指针转换为接口指针

这是我的设置的一些伪代码:

class IMyClass { ... }; // pure virtual class
class CMyBaseClass { .... };
class CMyClass : public CMyBaseClass, public IMyClass { ... }
Run Code Online (Sandbox Code Playgroud)

然后我收集了CMyBaseClass*.我有自定义RTTI,它允许我找出一个类是否实现给定的接口.所以我可以找到哪些对象有IMyClass实现.我的问题是我无法将其强制转换为该界面.我不想使用标准RTTI和动态强制转换.

我正在考虑在我的自定义RTTI中存储一些指针差异,以便在一对类之间进行转换,但我还没有弄清楚让我开心的实现.

还有其他方法吗?

c++ casting rtti

3
推荐指数
1
解决办法
2900
查看次数

从GetPropValue获取接口

我想从对象实例动态获取属性值.我能够获得类属性,序数类型和字符串.GetPropValue的delphi源不支持tkInterface.有没有办法使用属性信息获取界面.BTW暴露的所有属性都是已发布的属性.

暂时,我使用TObject作为返回类型.GetPropValue返回对象实例的地址.我将其类型化为TObject并返回结果.

delphi rtti getproperty

3
推荐指数
1
解决办法
992
查看次数

在Delphi中动态分配值

我正在创建一个类似于对象检查器的控件,所以我想将属性的任何更改分配给相关对象.

var

v:TValue ;
 ctx : TRttiContext;
begin

  //  k.IsOrdinal := true ;
v := v.FromVariant(2)  ;


ctx.GetType(tButton).GetProperty('Style').SetValue(Button1, v.AsOrdinal);

end;
Run Code Online (Sandbox Code Playgroud)

上面是我的代码,但我收到无效的类型转换错误.

是否可以处理任何变量和枚举.(不需要对象和记录,因为它非常复杂)

delphi rtti

3
推荐指数
1
解决办法
589
查看次数

将TRttiProperty映射到等效的类定义

我想知道是否可以直接引用类定义以便将它与RTTI结合使用(将属性映射到TRttiProperty等).

例如

我想使用TMyClass.MyProperty作为TRttiProperty,而不必通过名称/字符串解析它,这将保持我的代码和编译器完整性,因为字符串变量可能拼写错误,等等.

谢谢

delphi reflection properties rtti delphi-xe

3
推荐指数
1
解决办法
305
查看次数

从编译器设置关闭RTTI有什么好处?

通过这个(RTTI有多贵?),似乎很清楚动态转换比静态类型比较昂贵,但我想知道在编译器选项(VS2010,/ GR-)中关闭RTTI选项是否值得

我的代码中没有动态强制转换(我用静态转换替换它们).但是(/ GR-)选项除了在使用动态强制转换时发出错误之外还有吗?那里有内存或代码优化吗?

提前致谢.

c++ dynamic-cast rtti static-cast visual-c++

3
推荐指数
1
解决办法
3267
查看次数

有没有办法在运行时识别变量的const修饰符?

我的意思是以下问题.然后我尝试const使用typeinfo库知道指针的类型和常量,我们得到它们:

int* pY1 = 0;
const int* pY2 = 0;
std::cout << "pY1: " << typeid(pY1).name() << std::endl;
std::cout << "pY2: " << typeid(pY2).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

pY1: int *
pY2: int const *
Run Code Online (Sandbox Code Playgroud)

但后来我尝试以下方法

int x1 = 0;
const int x2 = 0;   
std::cout << " x1: " << typeid(x1).name() << std::endl;
std::cout << " x2: " << typeid(x2).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出是

x1: int
x2: int
Run Code Online (Sandbox Code Playgroud)

ideone代码
是否可以识别运行时中的常量?如果是的话,怎么做?

c++ rtti

3
推荐指数
1
解决办法
102
查看次数

为什么name()函数返回的字符串是实现定义的?

考虑以下示例:

#include <iostream>
#include <typeinfo>
int main()
{
    int a=9;
    std::cout << typeid(a).name() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.8.1上的输出:i

MSVS 2010上的输出:int

为什么输出是编译器依赖?这背后的原因是什么?为什么它被保留为实现定义?为什么在所有编译器上没有相同的输出?C++标准是否明确地说明了这一点?

c++ rtti typeid

3
推荐指数
1
解决办法
128
查看次数

使用RTTI以递归方式迭代delphi中的内部记录

我在Delphi(柏林)有很多记录结构,我试图通过RTTI递归迭代.代码不适用于内部记录.我在这做错了什么?

 Procedure WriteFields(Const RType  : TRttiType;
                       Const Test   : TTestRecord;
                       Var   Offset : integer);
 var
   RFields : TArray<TRTTIField>;
   i : integer;
   Val : TValue;
 begin
   RFields := GetFields(Rtype);
   try
     for i := Low(RFields) to High(RFields) do
     begin
       if RFields[i].FieldType.TypeKind <> tkRecord then
       begin
         Val := rfields[i].GetValue(@Test);
         writeln(Format('Field Name: %s, Type: %s, Value: %s, Offset: %d',[
                RFields[i].Name,
                RFields[i].FieldType.ToString,
                Val.ToString,
                RFields[i].Offset]));
       end
       else
       begin
         WriteLn(Format('------- Inner record : %s',[RFields[i].name]));
         //recursively call this routine for the other records, and fields
         Writefields(RFields[i].FieldType,Test,Offset);
       end;
       Offset …
Run Code Online (Sandbox Code Playgroud)

delphi rtti

3
推荐指数
1
解决办法
179
查看次数