C определяет различные правила, касающиеся целочисленного продвижения, вот отличный ответ , описывающий, как это работает.
В GCC вы можете сделать это:
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
Что будет соответствовать максимальному значению типа, определенного правилами C, как указано выше.
При использовании std::min
или std::max
с использованием смешанных типов необходимо предоставить соответствующий тип для преобразования в качестве параметра шаблона:
size_t const subcount = std::min<Offset>(count, treecap - offset);
Чтобы получить мин / макс, который оценивает тип согласно правилам продвижения целых чисел C, необходимо знать, как соотносятся типы и каков будет результирующий тип для каждой комбинации левого и правого типов ввода .
Я хочу выполнить мин / макс, с тем же поведением, что и образец С в GCC, приведенном выше, и с тем же повышением (тем самым обеспечивая такое же поведение, как в GCC). Как я могу сделать это в C ++ и / или MSVC?
Обратите внимание, что сразу после выполнения этого "естественного" минимума / максимума я буду numeric_cast
приближаться к ожидаемому диапазону размеров.