February 08, 2015 Re: Special Type Challenge | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Marc Schütz | On Sunday, 8 February 2015 at 13:06:08 UTC, Marc Schütz wrote:
> No, `alias this` convert from the type it is declared in to another type. `opImplicitCast` would be declared in the destination type.
So like this?
struct Type1
{
string str;
}
struct Type2
{
string str;
Type2 opImplicitCast(Type1 t)
{
return Type2(t.str);
}
}
void main()
{
Type2 t2 = Type1("Hello, World!");
}
Instead of the opposite?
| |||
February 09, 2015 Re: Special Type Challenge | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Meta | On Sunday, 8 February 2015 at 19:59:40 UTC, Meta wrote:
> On Sunday, 8 February 2015 at 13:06:08 UTC, Marc Schütz wrote:
>> No, `alias this` convert from the type it is declared in to another type. `opImplicitCast` would be declared in the destination type.
>
> So like this?
>
> struct Type1
> {
> string str;
> }
>
> struct Type2
> {
> string str;
>
> Type2 opImplicitCast(Type1 t)
> {
> return Type2(t.str);
> }
> }
>
> void main()
> {
> Type2 t2 = Type1("Hello, World!");
> }
>
> Instead of the opposite?
Yes. It's almost like a constructor, but would be called wherever an explicit call to the constructor is required today:
struct S {
this(int x) {}
}
S test1() {
return 10; // not ok
return S(10); // works
}
struct T {
static typeof(this) opImplicitCast(int x) {
return typeof(this)(x);
}
}
T test1() {
return 10; // ok
return T(10); // not sure whether this should
// work or not
}
Because it's so similar to a constructor (it always needs to be static and return `typeof(this)`), maybe a special syntax can be used:
struct S {
@implicit this(int x) {}
}
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply