Как обойтить без макроса NOMINMAX

В комментариях к посту про проблему конфликта имен STL’евских std::min и std::max с одноименными макросами из файла windows.h мне подсказали интересное решение.

Если вместо, например, std::max(a, b) написать (std::max)(a, b), то результат работы препроцессора выглядит так:

#line 3 "minmax.cpp"
int main() {
  int a = (std::min)(10, 20);
  return 0;
}

вместо:

#line 3 "minmax.cpp"
int main() {
  int a = std::(((10) < (20)) ? (10) : (20));
  return 0;
}

и конфликта не происходит. Все компилируется без проблем.

Не берусь судить, на сколько это красивое решение, и я бы все-таки предпочел действовать напрямую через макрос NOMINMAX, но выход элегантный.

Другие посты по теме:


Оригинальный пост | Disclaimer

Комментарии