标签: rtti

为RTTI提升库

我应该使用哪个boost库在我的项目中实现RTTI?是状态图库吗?

c++ boost rtti

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

RTTI是否意味着动态绑定?

在C++中,运行时类型信息(RTTI)是否意味着动态绑定?

c++ rtti dynamic-binding

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

使用RTTI获取/设置子属性

鉴于下面的代码片段,使用GetPropValue(MyComponent,'MySubComponent.Prop1')引发EPropertyError异常.如何使用GetPropValue/SetPropValue检索或设置SubProperties的值?

Type
  TMySubComponent = class(TInterfacedPersitent)
  private
    FProp1: Integer;
  published
    property Prop1: integer read FProp1 write FProp1;
  end;

  TMyComponent = class(TCompoent)
  private
    FMySubComponent : TMySubcomponent; 
  published
    property MySubComponent: TMySubComponent read FMySubComponent write FMySubComponent ;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-xe

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

如何确定C++对象是否为time_t

如何确定C++对象是否是time_t,而不是整数类型time_t被定义为?

我特意想模板专门化一个函数,

template <typename T> void myFunction( T val );
template<>            void myFunction<time_t>( time_t val );
Run Code Online (Sandbox Code Playgroud)

这样当定义了time_t的整数类型被传递时,会调用unspecialized函数.

我的STL实现定义time_tlong,因此myFunction(42L)调用time_t特化.我怎么能阻止这个?

我尝试了专门化long,这导致编译错误(正文已定义).我也试过rtti,typeid(time_t).name()回归"long".

我如何区分time_t它被定义为的整数类型,和/或模板专门化time_t使得它的整数类型不会传递给专门化?

使用模板的方法更可取,但我会接受任何解决方案,运行时或编译时.

c++ templates typedef rtti template-specialization

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

当GetType成功时,为什么FindType无法获得RTTI?

我正试图抓住一个物体TRttiContext.FindType(QualifiedTypeName).这是我得到的:

program MissingRTTI;
{$APPTYPE CONSOLE}
uses System.SysUtils, RTTI, Classes;
type
  TMyClass = class(TObject) end;
var
  rCtx:   TRttiContext;
  rType:  TRttiInstanceType;
begin
  rCtx := TRttiContext.Create();
  rType := rCtx.GetType(TypeInfo(TMyClass)) as TRttiInstanceType;
  if (rType <> nil) then begin
    WriteLn('Type found using TypeInfo');
  end;
  rType := rCtx.FindType(TMyClass.QualifiedClassName) as TRttiInstanceType;
  if (rType <> nil) then begin
    WriteLn('Type found using qualified class name.');
  end;
  ReadLn;
  rCtx.Free();
end.
Run Code Online (Sandbox Code Playgroud)

不幸的是,rCtx.GetType似乎只找到了所需的类型.(我也尝试使用GetTypes列出所有类型.所需的类型不会出现在结果数组中.)任何人都知道如何强制编译器为此类型发出RTTI?

delphi rtti delphi-xe2

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

如何使用TypInfo RTTI方法将值设置为子属性项?

在我的问题: 如何使用"发件人"参数与"As"运算符一次超过一个类

我选择了Remy Lebeau的答案,因为它是大多数情况下最具活力的技术.它使用RTTI TypInfo类.

但是当我使用这个类时,另一个问题出现了: 我们如何设置子属性值?

function TRemote.UpdateQuery(DataSet: TDataSet; SQL: String): Boolean;
var
  PropInfo: PPropInfo;
begin
{ atualiza o código SQL padrão de um dataSet de consulta tipo View }
  PropInfo := GetPropInfo(DataSet, 'SQL', []);
  if not Assigned(PropInfo) then
  begin
    Result := False;
    Exit;
  end;
  try
    DataSet.Close;
    SetPropValue(DataSet, PropInfo, SQL);
    DataSet.Open;
    Result := True;
  except
    Result := False;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

示例:我有一个TIBQuery,我想更新SQL属性的文本.但是SQL属性是一个TStrings类,所以我必须使用SQL.Text.在上面的代码中,它将引发错误"无效的属性类型",因为我有一个TStrings,后来我尝试设置一个普通的字符串.

如何使用GetPropInfo访问SQL.Text? 是否有TIBQuery和TZQuery的共同祖先具有SQL属性,所以我可以更改为,而不是函数参数中的TDataSet?

delphi rtti delphi-2006

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

如何从type_info获取模板参数的类型

我有一棵树,每个节点基本上看起来像这样:

struct node
{
    std::unordered_set<object*> objects;
    std::map<std::type_index,node> children;
};
Run Code Online (Sandbox Code Playgroud)

当我遍历树以添加新类型时,我想要检查:

std::is_base_of<base,derived>
Run Code Online (Sandbox Code Playgroud)

但是,我对派生类型的唯一信息是a type_index/type_info*.

无论如何,我可以转变type_info*成一个template论点吗?

如果没有,我的其他选择是什么?我想可以调用decltype(*objects.begin()),但这需要每个节点中的每个集合永远不会为空.

c++ templates rtti c++11

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

为什么提前创建TRttiContext使我的RTTI测试运行得更快?

链接到原始问题是否有可能获得类属性的索引?并由Remy Lebeau和RRUZ回答

program Demo;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Winapi.Windows,
  System.Rtti, System.TypInfo;

type
  TMyClass = class
  private
    function GetInteger(const Index: Integer): Integer;
    procedure SetInteger(const Index, Value: Integer);
  public
    property P1: Integer Index 1 read GetInteger write SetInteger;
    property P2: Integer Index 2 read GetInteger write SetInteger;
    property P3: Integer Index 3 read GetInteger write SetInteger;
  end;

{ TMyClass }

function TMyClass.GetInteger(const Index: Integer): Integer;
begin
  Result := Index;
end;

procedure TMyClass.SetInteger(const Index, Value: Integer);
begin
  //
end;

{------------------------------------------------------------------------------}
function …
Run Code Online (Sandbox Code Playgroud)

delphi rtti

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

使用stid :: forward和typeid运算符是否有意义?

我想知道std::forward<>在提交实例时使用是否有意义typeid

template <typename T>
void foo(T&& value) {
  std::cout << typeid(std::forward<T>(value)).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

调用typeid(value)会产生相同的结果吗?

c++ rtti perfect-forwarding c++11

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

DynArraySize()仅适用于649个整数元素的数组

我在Delphi 10.2 Update 2中遇到了与RTTI相关的问题,并且能够将其跟踪到更少的代码量(见下文).

我有一些TPersistent-descendant类TMyObj发布类型的属性TArray<Integer>.当我通过GetDynArrayProp()它接收它的值并通过它查询它的大小时,DynArraySize()只能达到649个元素的大小.在此特殊计数之上返回一些非常大的值.

请注意,我的数组是从一个实例生成TDictionary<Integer,Boolean>Keys拥有自己的财产ToArray的方法.我也尝试修改,TMyObj.GetDynArray以便它TArray<Integer>直接返回一个实例,它正常工作.因此,我认为这可能会以一些神秘的方式相关联.

我的使用有DynArraySize()什么问题?这种动态数组的神秘行为背后是什么?

program RTTIPropDynArray;

{$APPTYPE CONSOLE}

uses
  System.Classes, System.Generics.Collections, System.SysUtils, System.TypInfo;

type
  TMyDict  = TDictionary<Integer,Boolean>;
  TMyArray = TArray<Integer>;

  TMyObj = class(TPersistent)
  private
    FValues: TMyDict;
    function GetDynArray: TMyArray;
  public
    constructor Create(const ACount: Integer);
    destructor Destroy; override;
  published
    property DynArray: TMyArray read GetDynArray;
  end;

{ TMyObj }

constructor TMyObj.Create(const ACount: Integer);
begin
  FValues …
Run Code Online (Sandbox Code Playgroud)

delphi rtti dynamic-arrays delphi-10.2-tokyo

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