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