如果编译器不"支持"RTTI,那是否意味着编译器无法处理其中包含虚函数的类层次结构?或者我是否误解了关于RTTI如何不便携的文献,问题出在其他地方?
谢谢大家的意见!
以下是否有任何真正的区别:
id value;
BOOL compare1 = [value isMemberOfClass:[SomeClass class]];
BOOL compare2 = [value class] == [SomeClass class];
Run Code Online (Sandbox Code Playgroud)
检查是否value是一个SomeClass对象?
这是我的设置的一些伪代码:
class IMyClass { ... }; // pure virtual class
class CMyBaseClass { .... };
class CMyClass : public CMyBaseClass, public IMyClass { ... }
Run Code Online (Sandbox Code Playgroud)
然后我收集了CMyBaseClass*.我有自定义RTTI,它允许我找出一个类是否实现给定的接口.所以我可以找到哪些对象有IMyClass实现.我的问题是我无法将其强制转换为该界面.我不想使用标准RTTI和动态强制转换.
我正在考虑在我的自定义RTTI中存储一些指针差异,以便在一对类之间进行转换,但我还没有弄清楚让我开心的实现.
还有其他方法吗?
我想从对象实例动态获取属性值.我能够获得类属性,序数类型和字符串.GetPropValue的delphi源不支持tkInterface.有没有办法使用属性信息获取界面.BTW暴露的所有属性都是已发布的属性.
暂时,我使用TObject作为返回类型.GetPropValue返回对象实例的地址.我将其类型化为TObject并返回结果.
我正在创建一个类似于对象检查器的控件,所以我想将属性的任何更改分配给相关对象.
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)
上面是我的代码,但我收到无效的类型转换错误.
是否可以处理任何变量和枚举.(不需要对象和记录,因为它非常复杂)
我想知道是否可以直接引用类定义以便将它与RTTI结合使用(将属性映射到TRttiProperty等).
例如
我想使用TMyClass.MyProperty作为TRttiProperty,而不必通过名称/字符串解析它,这将保持我的代码和编译器完整性,因为字符串变量可能拼写错误,等等.
谢谢
通过这个(RTTI有多贵?),似乎很清楚动态转换比静态类型比较昂贵,但我想知道在编译器选项(VS2010,/ GR-)中关闭RTTI选项是否值得
我的代码中没有动态强制转换(我用静态转换替换它们).但是(/ GR-)选项除了在使用动态强制转换时发出错误之外还有吗?那里有内存或代码优化吗?
提前致谢.
我的意思是以下问题.然后我尝试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代码
是否可以识别运行时中的常量?如果是的话,怎么做?
考虑以下示例:
#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++标准是否明确地说明了这一点?
我在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) rtti ×10
c++ ×5
delphi ×4
dynamic-cast ×2
casting ×1
class ×1
cocoa ×1
delphi-xe ×1
getproperty ×1
objective-c ×1
portability ×1
properties ×1
reflection ×1
static-cast ×1
typeid ×1
visual-c++ ×1