Testing implicit conversion to template instance with is() expression

Nicolas Sicard via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Mar 15 11:53:31 PDT 2015


On Sunday, 15 March 2015 at 18:33:32 UTC, Marc Schütz wrote:
> On Sunday, 15 March 2015 at 17:03:42 UTC, Marc Schütz wrote:
>> https://issues.dlang.org/show_bug.cgi?id=14286
>>
>> In the meantime, does someone know of a suitable workaround?
>
> I found the following workaround. Not beautiful, but it works:
>
> enum isValue(alias T) = __traits(compiles, typeof(T));
>
> template isConvertibleToInstanceOf(alias From, alias To)
> if(isValue!From)
> {
>     enum isConvertibleToInstanceOf = 
> isConvertibleToInstanceOf!(typeof(From), To);
> }
>
> template isConvertibleToInstanceOf(From, alias To)
> if(!is(From == struct) && !is(From == class) && !is(From == 
> interface))
> {
>     enum isConvertibleToInstanceOf = false;
> }
>
> template isConvertibleToInstanceOf(From, alias To)
> if(is(From == struct) || is(From == class) || is(From == 
> interface))
> {
>     // workaround for 
> https://issues.dlang.org/show_bug.cgi?id=14286
>     import std.typetuple : anySatisfy;
>     enum aliasThisConvertible(string name) = 
> isConvertibleToInstanceOf!(mixin("typeof(From." ~ name ~ ")"), 
> To);
>     enum isConvertibleToInstanceOf =
>             anySatisfy!(aliasThisConvertible, 
> __traits(getAliasThis, From)) ||
>             is(From : To!Args, Args...);
> }

It works for your previous code example:
static assert(isConvertibleToInstanceOf!(S!10, V)); // OK

But this also works:
static assert(!isConvertibleToInstanceOf!(S!10, V!"abc")); // OK

Can be reduced to:
struct Foo(int i) {}
alias Foo1 = Foo!1;
static assert(is(Foo!2 == Foo1!T, T...)); // OK

I think it's another bug.



More information about the Digitalmars-d-learn mailing list