Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A min= idiom in C++?

We use

x += y

instead of

x = x + y

And similarly for *,/,- and other operators. Well, what about

x min= y

instead of

x = std::min(x, y)

? Is there a commonly-used idiom for this command, not requiring the (impossible) extension of the language with another operator?

like image 670
einpoklum Avatar asked Aug 05 '13 09:08

einpoklum


3 Answers

It's certainly not idiomatic, but you might be able to use something called named operators (see these Q&As here and here, developed by @Yakk and @KonradRudolph), and write

x <min>= y;

which is made possible by overloading operator< and operator>, combined with a clever wrapped named_operator. The full code is given by the link above, but uses code like

template <typename T1, typename T2, typename F>
inline auto operator >(named_operator_lhs<T1, F> const& lhs, T2 const& rhs)
    -> decltype(lhs.f(std::declval<T1>(), std::declval<T2>()))
{
    return lhs.f(lhs.value, rhs);
}

Using std::min as template argument for the template parameter F, would update the lhs of the expression with the min of the lhs and rhs.

like image 106
TemplateRex Avatar answered Oct 21 '22 03:10

TemplateRex


You can't extend the language in this way. The closest you can come is something like:

template <typename T, typename U>
T&
mineq( T& lhs, U rhs )
{
    if ( rhs < lhs ) {
        lhs = rhs;
    }
    return lhs;
}

This would allow writing:

mineq( x, y );

I question whether it's worth the bother, however.

like image 23
James Kanze Avatar answered Oct 21 '22 03:10

James Kanze


NO. There is no such thing, you'll have to do with std::min(x,y);

like image 28
Tony The Lion Avatar answered Oct 21 '22 04:10

Tony The Lion