
Hi Andrew, Andrew Sutton wrote:
template< class T, class L, class U > typename common_type< T const &, L const &, U const & >::type clamp(T const & x, L const & lower, U const & upper) { return x < lower ? lower : upper < x ? upper : x; }
for the use of common_type (assuming it accepts 3 parameters, which I seem to remember it did; if not, just nest); and something like
Can we please not define algorithms this way? It may be possible, but that doesn't mean its a good idea. I don't know how you could possibly prove that the algorithm preserves ordering (<) when the algorithm includes 5 possibly different types.
Thats not strictly true. I do know how you can prove it preserves ordering, but I'm not going to encourage the style.
Define it in terms of a single type and let conversions happen at the call type.
Consider the case where the types differ only in some attribute like their allocator that doesn't change the behaviour of comparisons. Yes, it may be possible to convert to a common type - but that will involve extra work at runtime. If you need to prove the correctness of something and this makes that difficult for you, you're welcome to use a subset of the functionality. Regards, Phil.