On Wednesday, 17 May 2023 at 08:00:17 UTC, Dom DiSc wrote:
If you want auto-conversion, you should be more explicit:
```d
float opCast() { }
```
because if you return "auto" it is not the highest-prio fit and therefore not chosen. If you have multiple choices, you still don't need to use "auto". Instead you can return T:
```d
T opCast(T)() if(isFloatingPoint!T)
{
   return cast(T)num / cast(T)den; // float, double or real
}
```
Kind of ironic, but especially "auto" does NOT fit automatically :-)

Sorry for not expressing myself better. Let me try to explain with another example:

```d
struct RightShift
{
  int num, shr;

  T opCast(T : char)()
   => cast(T)(num >> shr);
}
import std.stdio;
void main()
{
  auto f = RightShift(128, 2);
  char chr = cast(char)f | '\1';
  assert(chr == '!');
  
  //char test = f; // Error: cannot implicitly convert expression
  //assert(test == ' '); // `f` of type `RightShift` to `char`
}
```

This snippet works fine. But hidden the code gives an error. The reason is that the compiler ignores the explicitly specified lines without using auto.

SDB@79

Reply via email to