I think this is what you want. This example compiled and ran using DMD v2.060.

FooType.T1 func(FooType, FooT1)(FooType foo, FooT1 x)
  if (is(FooType.T1) && is(FooT1 : FooType.T1))
{
        return x * foo.a;
}

void main()
{
        auto foo = new Foo!(size_t, real)(3, 2.5);

        writeln(foo.func(4));
}

 - Vijay

On Monday, 12 November 2012 at 13:13:56 UTC, Joseph Rushton Wakeling wrote:
On 11/12/2012 02:02 PM, bearophile wrote:
Like this?

Thanks for the thought, but not really :-( Your code _checks_ that the second argument has the correct type, but it doesn't perform an implicit conversion where that is possible.

In a pseudo-code-y sense, what I want to be able to do is something like:

    auto func(FooT)(FooT foo, FooT.T1 x)
    {
        ...
    }

and indeed I tried that on the off-chance that it'd work; but it fails to compile with an error message "Undefined identifier FooT.T1".

All of the messing around with a second template argument was just in order to be able to achieve something equivalent to the above.


Reply via email to