How to create a custom max() function without the ambiguity error.

Mike Parker aldacron at gmail.com
Fri Dec 6 22:14:10 UTC 2019


On Friday, 6 December 2019 at 21:02:53 UTC, realhet wrote:

>
> Here's my latest attempt on EXTENDING std.algorithm.max's 
> functionality with a max operation on a custom type.
> The type is the GLSL vec2 type which does the max operation 
> component-wise.
> The D std implementation uses the < operator, but with 
> overriding that for my custom type it is impossible to realise. 
> -> max(vec2(1, 2), vec2(2,1)) == vec2(2,2)

The reason you're having so much trouble with this is that you're 
violating the contract of max. It's a template, so it's already 
set up to work with custom types without any need to write a 
custom max function, as long as the types adhere to the contract.

Consider other functions in std.algorithm, such as sort or equal, 
that allow you to pass a custom predicate. max doesn't have that 
because, by defintion, there is only one comparison for it to do: 
 >. Any type that doesn't support that isn't going to work with 
max.

Moreover, your return value violates the function's contract:

"Iterates the passed arguments and return the maximum value."

You aren't returning the maximum value. You're returning a new 
value constructed from the maximum components of the two 
parameters. That is not the same behavior as max(1, 3).

Given that your function has a different contract, it should also 
have a different name.


More information about the Digitalmars-d-learn mailing list