max() in phobos, and English logic operators

Sean Kelly sean at
Wed Nov 8 05:54:32 PST 2006

Jarrett Billingsley wrote:
> "David Qualls" <davidlqualls at> wrote in message 
> news:eirqai$he$1 at
>> So, is it possible to use templates to define generic binary
>> operators; like 'and' and 'or', or a unary operator like 'not'?
> Not like the way you'd use the iso646 ones.  It'd be really unnatural:
> if(not(and(a, or(b, c))))
>     ...

Yup.  These are in C++ only to allow expressions to be built using 
template composition for use in algorithms.  And the result quickly gets 
annoyingly complex and hard to read.  Lambda expression are a much 
clearer replacement, which we have to some degree with lazy parameters 
and anonymous delegates.  By contrast, C++ uses fancy classes with 
cleverly overloaded operators and some global placeholders.  It works 
fairly well all things considered, but the code behind it is a bit much.

>> After looking at the mass of code it takes to implement a simple
>> generic max() or min() function in D, I'm really starting to pine
>> for my C preprocessor...
>> #define max(a,b) ((a)>(b)?(a):(b))
>> Yeah, I know it breaks if a or b include side effects, but it's
>> extremely READABLE! (And back on my old soap-box, even FORTRAN and
>> Basic include English binary logic operators ;-)
> Well, if you make the max function a bit less generic, restricting it to 
> just one input type, it becomes
> T max(T)(T a, T b)
> {
>     return (a > b) ? a : b;
> }
> Which is pretty readable to me, and probably covers most of the use cases. 
> Most of that conversion stuff in Sean's implementation is probably type 
> trait stuff which would best belong in std.traits (when it comes out).. 

Agreed on both counts.  My template was really to avoid requiring the 
user to explicitly specify template type parameters of the types of a 
and b are different, to make min/max behave as close to the C macro as 


More information about the Digitalmars-d-learn mailing list