Thread overview | ||||||
---|---|---|---|---|---|---|
|
March 06, 2020 Safe cast | ||||
---|---|---|---|---|
| ||||
Searching info for object casting with checking class type at runtime. Like this: class A { // } class B { int bVar; } unittest { A a = new A(); A x = cast( A )a; // ok A x = cast( B )a; // ok, but unsafe A x = safeCast( B )a; // throw exception A x = safeCast( A )a; // ok } Searching some like next: T safeCast( CLS )( CLS o ) { ... // checking type of o ... // may be check ClassInfo... return T; } Has function like a safeCast() ? Or other solution ? ... |
March 06, 2020 Re: Safe cast | ||||
---|---|---|---|---|
| ||||
Posted in reply to Виталий Фадеев | On Friday, 6 March 2020 at 12:35:29 UTC, Виталий Фадеев wrote:
> Searching info for object casting with checking class type at runtime.
>
> Like this:
>
> class A
> {
> //
> }
>
> class B
> {
> int bVar;
> }
>
>
> unittest
> {
> A a = new A();
>
> A x = cast( A )a; // ok
> A x = cast( B )a; // ok, but unsafe
> A x = safeCast( B )a; // throw exception
> A x = safeCast( A )a; // ok
> }
>
>
> Searching some like next:
>
> T safeCast( CLS )( CLS o )
> {
> ... // checking type of o
> ... // may be check ClassInfo...
> return T;
> }
>
> Has function like a safeCast() ?
> Or other solution ? ...
I using now next code:
import std.stdio;
class Base {}
class A : Base {}
class B : Base {}
T safeCast( T, CLS )( CLS o )
{
if ( typeid( o ) == typeid( T ) )
return cast(T)o;
else
throw new Exception( "casting error" );
}
void main()
{
Base a = new A();
A x1 = cast( A )a; // ok
B x2 = cast( B )a; // ok, but unsafe
B x3 = safeCast!B( a ); // throw exception
A x4 = safeCast!A( a ); // ok
}
|
March 06, 2020 Re: Safe cast | ||||
---|---|---|---|---|
| ||||
Posted in reply to Виталий Фадеев | It's too complex On 3/6/20 3:45 PM, Виталий Фадеев wrote: > On Friday, 6 March 2020 at 12:35:29 UTC, Виталий Фадеев wrote: >> Searching info for object casting with checking class type at runtime. >> >> Like this: >> >> class A >> { >> // >> } >> >> class B >> { >> int bVar; >> } >> >> >> unittest >> { >> A a = new A(); >> >> A x = cast( A )a; // ok >> A x = cast( B )a; // ok, but unsafe Here x will be null. You can use `enforce(x !is null);` if you want exception. >> A x = safeCast( B )a; // throw exception >> A x = safeCast( A )a; // ok >> } >> |
March 06, 2020 Re: Safe cast | ||||
---|---|---|---|---|
| ||||
Posted in reply to drug | On Friday, 6 March 2020 at 13:03:22 UTC, drug wrote:
> Here x will be null. You can use `enforce(x !is null);` if you want exception.
or since enforce returns it thing, just do
B b = enforce(cast(B) x);
you can also check easily in if statements:
if(auto b = cast(B) x) {
// x was a b, use b in here
} else {
// x was not b, try something else
}
|
Copyright © 1999-2021 by the D Language Foundation