std.sumtype needs implicit conversion to reach its full potential.

FeepingCreature feepingcreature at gmail.com
Tue Nov 16 11:15:27 UTC 2021


Just now, I was looking to extend our mock framework to allow 
leaving single parameters unspecified. "Okay," I thought, "this 
shouldn't be too hard":

```
import std.sumtype;

struct Mocker
{
   static struct any {}
}

alias typeOrAny(T) = sumtype!(T, Mocker.any);

template expectationMethod(alias fn)
{
   alias ExpectedParams = staticMap!(typeOrAny, Parameters!fn);

   void method(ExpectedParams params)
}

.....

class TestClass {
   void call(string name, int value);
}

unittest
{
   auto mockedClass = mock!TestClass;

   mockedClass.expect.call("Hello World", Mocker.any); // So terse 
and elegant!
}
```

But, actually, that doesn't work: here's what you currently need 
to write in D.

```
unittest
{
   ...
   mockedClass.expect.call(typeOrAny!string("Hello World"), 
typeOrAny!int(Mocker.any));
```

I don't care if it needs a feature with two or even three 
underscores in front. I don't care if it's undocumented. I don't 
care if it only works for `std.sumtype`, even though 
`std.typecons: nullable` is *begging* for the same functionality; 
or if you literally write into the compiler license that you can 
sue people for thousands of dollars if they use it badly.

Just, please, give std.sumtype the ability to be implicitly 
constructed from a member type in function parameters.



More information about the Digitalmars-d mailing list