Fastest way to check if the bottom-class of a class reference is any of a set of classes

Steven Schveighoffer schveiguy at gmail.com
Mon Dec 16 18:01:06 UTC 2019


On 12/16/19 9:38 AM, Per Nordlöw wrote:
> What is the fastest way to check whether a class reference is an 
> instance of a
> bottom equal to any in a set of classes? My current try is something like
> 
> class C {}
> 
> class X : C {}
> class Y : C {}
> class Z : C {}
> ....
> 
> bool pred(scope const Object object)
> {
>      return (cast(const(X))object ||
>              cast(const(Y))object ||
>              cast(const(Z))object ||
>              ...);
> }
> 
> or is it better to switch on the non-scoped (via some existing 
> string-to-string
> function `unscoped`) part of the `typeid(object).name` like
> 
> bool pred(scope const Object object)
> {
>      const name = typeid(object).name.unscope;
>      import std.algorithm.comparison : among;
>      return name.among!(X.stringof,
>                         Y.stringof,
>                         Z.stringof,
>                         ...);
> }
> 
> ?

I'd compare the typeid directly:

auto tid = typeid(object);

return(tid is typeid(X) || tid is typeid(Y) || tid is typeid(Z) || ...)

If you are doing a cast(const(X))object, what you are doing is each time 
traversing the linked-list of typeids anyway doing the same as the 
above, but doing extra work. So this should be faster.

-Steve


More information about the Digitalmars-d-learn mailing list