Шаблонизированная безветвевая функция int max/minC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Шаблонизированная безветвевая функция int max/min

Сообщение Anonymous »

Я пытаюсь написать функцию без ветвей, возвращающую MAX или MIN двух целых чисел, не прибегая к if (или ?:). Используя обычную технику, я могу сделать это достаточно легко для заданного размера слова:

Код: Выделить всё

inline int32 imax( int32 a, int32 b )
{
// signed for arithmetic shift
int32 mask = a - b;
// mask < 0 means MSB is 1.
return a + ( ( b - a ) & ( mask >> 31 ) );
}
Теперь, предполагая, что я действительно пишу приложение на том типе процессора, где это необходимо, мой вопрос заключается в том, есть ли способ используйте шаблоны C++, чтобы обобщить это на все размеры int.

Шаг >>31, конечно, работает только для int32, и хотя я мог скопировать перегрузки функции для int8, int16, и int64, похоже, мне следует использовать вместо этого функцию шаблона. Но как мне получить размер аргумента шаблона в битах?

Есть ли лучший способ сделать это, чем этот? Могу ли я принудительно подписать маску T? Если T не имеет знака, шаг сдвига маски не будет работать (поскольку это будет логический, а не арифметический сдвиг).

Код: Выделить всё

template< typename T >
inline T imax( T a, T b )
{
// how can I force this T to be signed?
T mask = a - b;
// I hope the compiler turns the math below into an immediate constant!
mask = mask >> ( (sizeof(T) * 8) - 1 );
return a + ( ( b - a ) & mask );
}
И, сделав вышеизложенное, могу ли я запретить его использование для чего-либо, кроме целочисленного типа (например, без чисел с плавающей запятой или классов)?

Подробнее здесь: https://stackoverflow.com/questions/514 ... n-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»