Specifying eponymous template "internal parameter"

monarch_dodra monarchdodra at gmail.com
Tue Jan 8 02:16:31 PST 2013


On Tuesday, 8 January 2013 at 09:59:26 UTC, Simen Kjaeraas wrote:
> On 2013-55-08 09:01, monarch_dodra <monarchdodra at gmail.com> 
> wrote:
>
>> Sometimes (especially in phobos), one defines a parametrized 
>> template, that resolves to a templated function.
>>
>> This is a nifty trick, because it allows specifying a vararg 
>> before the current type parameter, eg:
>>
>> //----
>> auto r = [1, 2, 3];
>> auto m = map!("++a", "--a")(r);
>> //----
>>
>> As you can see, the template guessed the type of r, even 
>> though we used a vararg. This would not have worked with a 
>> single template function.
>>
>> My question though: I have a similar use case, but I NEED to 
>> be able to explicitly specify the type of r: as such:
>>
>> //----
>> auto m = fun!("++a", "--a", ubyte)(1);
>> auto m = fun!("++a", "--a")!(ubyte)(1);
>> auto m = fun!("++a", "--a").fun!ubyte(1);
>> //----
>> None of them work. In this specific case, I *need* to specify 
>> that 1 is of type ubyte, but I really can't do it :/
>>
>> Simplified example: in my use case, it is a 
>> "immutable(int[])": Failure to specify the type means the 
>> compiler strips tail immutability...
>>
>> The only workaround I can find to make such a thing, is to 
>> *not* use eponymous temples, and explicitly call an inner 
>> function. This is ugly as sin, and it makes specifying the 
>> internal parameter mandatory.
>>
>> Any thoughts?
>
> A non-eponymous template is currently the only way to do this. 
> Strangely, this works:
>
>   alias fun2 = fun!("++a", "--a");
>   auto m = fun2!(ubyte)(1);

Nice!

And now, for the 1M$ question: Can I rely on this behavior, or is 
this an accepts invalid...?


More information about the Digitalmars-d-learn mailing list