Testing implicit conversion to template instance with is() expression

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Mar 15 11:33:30 PDT 2015


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...);
}


More information about the Digitalmars-d-learn mailing list