#include <iostream>
#include <utility>
#include <type_traits>
template<typename T>
T Min(T&& t)
{
return std::forward<T>(t);
}
template<typename T0, typename T1, typename... Tv>
std::common_type_t<T0, T1, Tv...> Min(T0&& first, T1&& second, Tv&&... args)
{
return first < second ? Min(first, std::forward<Tv>(args)...) : Min(second, std::forward<Tv>(args)...);
}
int main()
{
int x = 7;
int y = 3;
int& z0 = x;
int& z1 = y;
((z0<z1)?z0:z1)=2;
// vmin(z0, z1) = 2; -- want this to work, return an lvalue, but cannot with common_type
std::cout << x << "," << y << "\n";
std::cout << Min(3, 2, 0.9, 2, 5) << std::endl;
std::cout << Min(3., 1.2, 1.3, 2., 5.2) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgVCBNaW4oVCYmIHQpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxUPih0KTsKICAgIH0KICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZS4uLiBUdj4KICAgIHN0ZDo6Y29tbW9uX3R5cGVfdDxUMCwgVDEsIFR2Li4uPiBNaW4oVDAmJiBmaXJzdCwgVDEmJiBzZWNvbmQsIFR2JiYuLi4gYXJncykKICAgIHsKICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQgPyBNaW4oZmlyc3QsIHN0ZDo6Zm9yd2FyZDxUdj4oYXJncykuLi4pIDogTWluKHNlY29uZCwgc3RkOjpmb3J3YXJkPFR2PihhcmdzKS4uLik7CiAgICB9CgppbnQgbWFpbigpCnsKCWludCB4ID0gNzsKCWludCB5ID0gMzsKCWludCYgejAgPSB4OwoJaW50JiB6MSA9IHk7CgkoKHowPHoxKT96MDp6MSk9MjsKLy8gCXZtaW4oejAsIHoxKSA9IDI7IC0tIHdhbnQgdGhpcyB0byB3b3JrLCByZXR1cm4gYW4gbHZhbHVlLCBidXQgY2Fubm90IHdpdGggY29tbW9uX3R5cGUKCXN0ZDo6Y291dCA8PCB4IDw8ICIsIiA8PCB5IDw8ICJcbiI7CglzdGQ6OmNvdXQgPDwgTWluKDMsIDIsIDAuOSwgMiwgNSkgPDwgc3RkOjplbmRsOwoJCglzdGQ6OmNvdXQgPDwgTWluKDMuLCAxLjIsIDEuMywgMi4sIDUuMikgPDwgc3RkOjplbmRsOwoKCXJldHVybiAwOwp9