free func "front" is not picked up as a candidate when doing range.front(...)

aliak something at something.com
Wed Feb 7 19:25:01 UTC 2018


Hi, I'm trying to make a range.front free function that can be 
given a defaultValue. Doesn't seem to be working as is written 
below, seems like the compiler doesn't see the free function as a 
viable candidate. Isn't it supposed to do its UFCS wizardry and 
pick up the free func?

import std.stdio;

auto front(Range, T)(Range range, T defaultValue) {
     import std.range: empty, front;
     return range.empty ? defaultValue : range.front;
}

void main()
{
     import std.range: iota;
     0.iota.front(100).writeln;
// Error: inout method std.range.iota!(int, 
int).iota.Result.front is not callable using a mutable object

     import std.algorithm: filter;
     auto arr = [0, 1];
     arr.filter!"true".front(99).writeln;
// Error: function 
std.algorithm.iteration.FilterResult!(unaryFun, 
int[]).FilterResult.front () is not callable using argument types 
(int)

     arr.front(30).writeln; // OK

     import std.range: front;
     arr.front(30).writeln;
// Error: template std.range.primitives.front cannot deduce 
function from argument types !()(int[], int), candidates are: 
std.range.primitives.front(T)(T[] a) ...
}

Cheers


More information about the Digitalmars-d-learn mailing list