Так вот, если включаешь <windows.h>, компилятор ругается на объявление ф-ии min.
Я так понимаю из-за того что в <windef.h> описан #define min().
Как же мне быть если виндовая min, применительно к myClass, меня не устраивает?
Ч>Так вот, если включаешь <windows.h>, компилятор ругается на объявление ф-ии min. Ч>Я так понимаю из-за того что в <windef.h> описан #define min(). Ч>Как же мне быть если виндовая min, применительно к myClass, меня не устраивает?
меня не устраивает!
Нужно выполнить как бы перекрытие функций (хотя windows::min это не функция)
Т.е. чтобы для любых типов вызывалась windows::min, а для типа myClass — моя min!
Ч>Так вот, если включаешь <windows.h>, компилятор ругается на объявление ф-ии min. Ч>Я так понимаю из-за того что в <windef.h> описан #define min(). Ч>Как же мне быть если виндовая min, применительно к myClass, меня не устраивает?
Заключи имя функции в скобки — препроцессор в этом случае не будет выполнять подстановку:
Для полноты добавлю, что кроме препроцессора, это отразится и на собственно компиляторе: взятие имени функции в скобки отключает ADL.
Кстати, зачем вообще могут понадобиться Windows::min/max? Они и неустойчивы (min(a, b) дает b при a == b), и опасны (min(i++, j--)), и требуют наличия operator > для max (std::max использует <), и захламляют все namespace, и компаратор не умеют (std::min(a, b, Compare())).
std::min/max тоже имеют проблемы, но они, как мне кажется, на порядок менее опасны: не работает max(x, y) %= min(x, y), зато работает &std::min(0, 1).
Здравствуйте, rg45, Вы писали:
R>Прошу прощения за оффтопик, но все же... При вычислении наибольшего общего делителя легко можно избежать лишних сравнений внутри цикла: R>
R>template<typename T>
R>inline T gcd(T a, T b)
R>{
R> while(b)
R> {
R> T t = b;
R> b = a % b;
R> a = t;
R> }
R> return a;
R>}
R>
Результат функции от последовательности аргументов не зависит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Прошу прощения за оффтопик, но все же... При вычислении наибольшего общего делителя легко можно избежать лишних сравнений внутри цикла: R>
R>template<typename T>
R>inline T gcd(T a, T b)
R>{
R> while(b)
R> {
R> T t = b;
R> b = a % b;
R> a = t;
R> }
R> return a;
R>}
R>
Хм. Заинтересовавшись, полез в boost/math/common_factor_rt.hpp:
while ( true )
{
if ( a == zero )
return b;
b %= a;
if ( b == zero )
return a;
a %= b;
}
Здравствуйте, _KAV_, Вы писали:
_KA>Ну, а если писать очень кратко, то НОД можно найти так: _KA>int GCD( int a, int b ) _KA>{ _KA> while( a*b ) a > b ? a %= b : b %= a; _KA> return a+b; _KA>}