Целочисленная раскрутка, C ++ и шаблоны - PullRequest
1 голос
/ 05 ноября 2010

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 приближаться к ожидаемому диапазону размеров.

1 Ответ

1 голос
/ 07 ноября 2010

Здесь очень хорошая реализация, которую я использовал для различных проектов: http://www.oonumerics.org/blitz/traits.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...