Re: Implicit type conversion depending on assignment

2023-03-24 Thread Salih Dincer via Digitalmars-d-learn
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:

```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but 
it can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```


Have you tried using an associative array?

I feel that you will come up with a solution for your purpose 
from the examples below:


```d
template MyContainer(string data = "")
{   // Container name ---^
  struct Var
  {
import std.variant;

private Variant[string] values;
alias values this;

@property
{
  Variant opDispatch(string key)() const
  {
return values[key];
  }

  void opDispatch(string key, T)(T val)
  {
values[key] = val;
  }
}
  }

  static if(data.length > 0)
  {
import std.format;

mixin(data.format!"Var %s;");

  } else {

Var data; // no conflicts

  }
}

import std.stdio;

void main()
{
  enum Tarih
  {
AY  = 1,
YIL = 2023
  }
  mixin MyContainer!"date";

  date.month = cast(ubyte)Tarih.AY;
  date.month.write("/");

  assert(date["month"] != Tarih.AY);
  assert(date["month"].type == typeid(ubyte));

  date.year = cast(short)Tarih.YIL;
  date.year.writeln(" in Turkish format");

  assert(date["year"] != Tarih.YIL);
  assert(date["year"].type == typeid(short));

  writefln("Date: %s/%s", date.year, date.month);
}
```

SDB@79


Re: Implicit type conversion depending on assignment

2023-03-24 Thread bachmeier via Digitalmars-d-learn

On Friday, 24 March 2023 at 13:53:02 UTC, bachmeier wrote:
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:
Is it possible to convert such records inside the structure to 
the assigned type?


```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but 
it can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```


You're limited by the use of int and float. It works just fine 
for structs:


```
struct MyInt {
int x;
alias x this;

this(MyString s) {
x = s.to!int;
}

void opAssign(MyString s) {
x = s.to!int;
}
}

struct MyFloat {
float x;
alias x this;

this(MyString s) {
x = s.to!float;
}

void opAssign(MyString s) {
x = s.to!float;
}
}

struct MyString {
string s;
alias s this;
}

void main() {
auto ms = MyString("100");
auto ms2 = MyString("11.2");
MyInt mi = ms;
MyFloat mf = ms2;
}
```


`opAssign` is not needed for this code to compile, but it would 
be if you had


```
MyInt mi;
mi = ms;
```


Re: Implicit type conversion depending on assignment

2023-03-24 Thread bachmeier via Digitalmars-d-learn
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:
Is it possible to convert such records inside the structure to 
the assigned type?


```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but 
it can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```


You're limited by the use of int and float. It works just fine 
for structs:


```
struct MyInt {
int x;
alias x this;

this(MyString s) {
x = s.to!int;
}

void opAssign(MyString s) {
x = s.to!int;
}
}

struct MyFloat {
float x;
alias x this;

this(MyString s) {
x = s.to!float;
}

void opAssign(MyString s) {
x = s.to!float;
}
}

struct MyString {
string s;
alias s this;
}

void main() {
auto ms = MyString("100");
auto ms2 = MyString("11.2");
MyInt mi = ms;
MyFloat mf = ms2;
}
```


Re: Implicit type conversion depending on assignment

2023-03-24 Thread Jacob Shtokolov via Digitalmars-d-learn

On Friday, 24 March 2023 at 09:59:47 UTC, Alexander Zhirov wrote:

On Friday, 24 March 2023 at 09:46:26 UTC, Jacob Shtokolov wrote:
BTW, you can also `alias this` your struct value and then use 
`std.conv : to` for casting, if you don't need specific 
casting rules.


I don't quite understand what you mean? Could you show me an 
example?


I mean, it would be the same code except that you don't define 
any `opCast` or other operators for a struct, just alias the 
value to `this` and use `std.conv : to` directly as follows:


```d
struct MyVal
{
string value;
alias value this;
}

void main()
{
import std.stdio;
import std.conv;

auto a = MyVal("100");
auto b = MyVal("11.2");

auto MyInt = a.to!int;
auto myFloat = b.to!float;

writeln(MyInt, ", ", myFloat);
}
```


Re: Implicit type conversion depending on assignment

2023-03-24 Thread Alexander Zhirov via Digitalmars-d-learn

On Friday, 24 March 2023 at 09:46:26 UTC, Jacob Shtokolov wrote:
BTW, you can also `alias this` your struct value and then use 
`std.conv : to` for casting, if you don't need specific casting 
rules.


I don't quite understand what you mean? Could you show me an 
example?




Re: Implicit type conversion depending on assignment

2023-03-24 Thread Jacob Shtokolov via Digitalmars-d-learn

On Friday, 24 March 2023 at 09:39:00 UTC, Jacob Shtokolov wrote:
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:
Is it possible to convert such records inside the structure to 
the assigned type?


BTW, you can also `alias this` your struct value and then use 
`std.conv : to` for casting, if you don't need specific casting 
rules.




Re: Implicit type conversion depending on assignment

2023-03-24 Thread Jacob Shtokolov via Digitalmars-d-learn
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:
Is it possible to convert such records inside the structure to 
the assigned type?


```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but 
it can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```


Here is another working variation of Ali's code, try it yourself:

```d
import std.stdio;
import std.conv;

struct MyVal
{
string value;
T opCast(T)() { return value.to!T; }
}

void main()
{
auto a = MyVal("100");
auto b = MyVal("11.2");

auto MyInt = a.to!int;
auto myFloat = b.to!float;

writeln(MyInt, ", ", myFloat);
}
```

In general, all type casting and parsing stuff usually exist 
under `std.conv` in the standard library, so you can take 
advantage of it.


Re: Implicit type conversion depending on assignment

2023-03-23 Thread Ali Çehreli via Digitalmars-d-learn

On 3/23/23 07:36, Alexander Zhirov wrote:

>  @property auto toString(T)()

The name is misleading because you want types other than string as well.

>  alias toString this;

That should have been a compilation error because 'toString' does not 
have a known type (because it depends on a template parameter). How can 
the compiler accept that 'alias this'?


> int myInt   = a;
> float myFloat   = b;

Since you need to spell out 'int' and 'float' in some form anyway, the 
following would be my choice, which I did use in my code before:


struct MyVal
{
private string value;

auto to(T)()
{
import std.conv : to;
return value.to!T;
}
}

void main() {
auto a = MyVal("100");
auto b = MyVal("11.2");

auto myInt = a.to!int;
auto myFloat = b.to!float;
}

Should it be an error to convert 'a' to float? If so, the following 
modules may be helpful:


  https://dlang.org/phobos/std_sumtype.html

  https://dlang.org/phobos/std_variant.html

Ali



Re: Implicit type conversion depending on assignment

2023-03-23 Thread zjh via Digitalmars-d-learn
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:
Is it possible to convert such records inside the structure to 
the assigned type?


```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but 
it can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```



However, `rust` and`cpp` are all can!
[Here](http://purecpp.cn/detail?id=2342).



Re: Implicit type conversion depending on assignment

2023-03-23 Thread apz28 via Digitalmars-d-learn
On Thursday, 23 March 2023 at 14:36:11 UTC, Alexander Zhirov 
wrote:

On Thursday, 23 March 2023 at 14:19:31 UTC, user1234 wrote:

omg, let's rewrite this...




Or abuse opBinary

struct MyVal
{
string value;
T opBinary(string op, T)(T rhs)
if (op == "+")
{
import std.conv : convto = to;
static if (is(T==int))
return convto!T(value) + rhs;
else static if (is(T==float))
return convto!T(value) + rhs;
else
static assert(0);
}

alias opBinary this;
}

void main()
{

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a + 0;
float myFloat = b + 0.0f;
}





Re: Implicit type conversion depending on assignment

2023-03-23 Thread Ali Çehreli via Digitalmars-d-learn

On 3/23/23 06:38, Alexander Zhirov wrote:
> Is it possible to convert such records inside the structure to the
> assigned type?

D does not embrace implicit conversions. There is some support like 
'alias this' as you mentioned but what you are looking for is not possible.


Ali



Re: Implicit type conversion depending on assignment

2023-03-23 Thread Alexander Zhirov via Digitalmars-d-learn
On Thursday, 23 March 2023 at 14:36:11 UTC, Alexander Zhirov 
wrote:

I wanted WITHOUT explicit casting.


I also have thoughts about using 
[templates](https://dlang.org/spec/template.html#this_rtti), but 
I don't have enough experience yet how to implement it.




Re: Implicit type conversion depending on assignment

2023-03-23 Thread Alexander Zhirov via Digitalmars-d-learn

On Thursday, 23 March 2023 at 14:19:31 UTC, user1234 wrote:

omg, let's rewrite this...


I meant something like that. But you can't do that. I wanted 
WITHOUT explicit casting.


```d
struct MyVal
{
private string value;

@property auto toString(T)()
{
return value.to!T;
}

alias toString this;
}

auto a = MyVal("100");
auto b = MyVal("11.2");

int myInt   = a;
float myFloat   = b;
```




Re: Implicit type conversion depending on assignment

2023-03-23 Thread user1234 via Digitalmars-d-learn

On Thursday, 23 March 2023 at 14:17:25 UTC, user1234 wrote:
not exactly thing goal yet. The doc example you have put a link 
for is different, the struct with alias this a redefinition of 
the "alias this"'ed thing, that just cant work in what you ask 
in the first post.


omg, let's rewrite this...

not exactly the same thing as the goal yet. The doc example you 
have put a link
for is different, the struct with "alias this" is a redefinition 
of
the "alias this"'ed thing, that just cant work in what you ask in 
the first post because the type is different.





Re: Implicit type conversion depending on assignment

2023-03-23 Thread user1234 via Digitalmars-d-learn
On Thursday, 23 March 2023 at 14:05:07 UTC, Alexander Zhirov 
wrote:
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:
Is it possible to convert such records inside the structure to 
the assigned type?


```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but 
it can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```


Here is an [example from the 
documentation](https://dlang.org/spec/struct.html#alias-this), 
but for "several" types, for example, with a cast check and a 
return of the default value.


The best I can think of ATM

```
struct MyVal
{
string value;
auto opCast(T)()
{
import std.conv : to;
return to!T(value);
}
}

void main()
{
auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt   = cast(int)a;
float myFloat   = cast(float)b;
}
```

not exactly thing goal yet. The doc example you have put a link 
for is different, the struct with alias this a redefinition of 
the "alias this"'ed thing, that just cant work in what you ask in 
the first post.


Re: Implicit type conversion depending on assignment

2023-03-23 Thread Alexander Zhirov via Digitalmars-d-learn
On Thursday, 23 March 2023 at 13:38:51 UTC, Alexander Zhirov 
wrote:
Is it possible to convert such records inside the structure to 
the assigned type?


```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but 
it can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```


Here is an [example from the 
documentation](https://dlang.org/spec/struct.html#alias-this), 
but for "several" types, for example, with a cast check and a 
return of the default value.


Implicit type conversion depending on assignment

2023-03-23 Thread Alexander Zhirov via Digitalmars-d-learn
Is it possible to convert such records inside the structure to 
the assigned type?


```d
struct MyVal
{
string value;
// Here it would be possible to use an alias to this, but it 
can only be used 1 time

}

auto a = MyVal("100");
auto b = MyVal("11.2");

int MyInt = a;// Implicitly convert to target type
float myFloat = b;// Implicitly convert to target type
```