On Tuesday, 6 February 2018 at 21:13:50 UTC, timotheecour wrote:
On Tuesday, 6 February 2018 at 20:39:09 UTC, Timothee Cour wrote:
should we force force casting through `void*` for extern(C++) classes ?
i.e. `cast(Derived) cast(void*) base_instance;`

currently, `cast(A) unrelad_cpp_instance` happily compiles but shouldn't, it's very error prone even though the cast syntax suggests type safety; especially a problem if we make a class become extern(C++) in the future

[came up after discussing with jacob-carlborg]



Actually how about introducing a library solution for explicit casting:
* works with UFCS chains (unlike cast)
* DSL is very intuitive, readable and extensible

```
foo.Cast!"+immutable,dynamic"
myint.cast!"-const,"unsigned"
```

meaning: +immutable: make immutable; -const: remove const storage class if was const; dynamic: only allow dynamic cast (cf avoids above bug); unsigned: cast integer to unsigned; other keywords could be trivially added to DSL


alternative is not DRY (eg: `Foo foo; cast(const(Foo)) foo;` ; not typesafe/expressive: (cast(Foo)foo) will remove const-ness in foo even though just a dynamic cast was intended for eg; and doesn't work in UFCS chains (requires lots of parenthesis)

Reply via email to