鉴于下面的代码片段,使用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) 如何确定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_t为long,因此myFunction(42L)调用time_t特化.我怎么能阻止这个?
我尝试了专门化long,这导致编译错误(正文已定义).我也试过rtti,typeid(time_t).name()回归"long".
我如何区分time_t它被定义为的整数类型,和/或模板专门化time_t使得它的整数类型不会传递给专门化?
使用模板的方法更可取,但我会接受任何解决方案,运行时或编译时.
我正试图抓住一个物体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?
在我的问题: 如何使用"发件人"参数与"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?
我有一棵树,每个节点基本上看起来像这样:
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()),但这需要每个节点中的每个集合永远不会为空.
链接到原始问题是否有可能获得类属性的索引?并由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) 我想知道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)会产生相同的结果吗?
我在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) rtti ×10
c++ ×5
delphi ×5
c++11 ×2
templates ×2
boost ×1
delphi-2006 ×1
delphi-xe ×1
delphi-xe2 ×1
typedef ×1