Функция шаблона C++ для сравнения любых целых чисел без знака и со знаком
Я хотел бы реализовать шаблонную функцию, которая сравнивает две переменные двух типов (T1 и T2). Эти типы являются двумя случайными целыми типами без знака или со знаком.
Чтобы иметь возможность сравнивать их правильно, мне нужно привести их обоих к большему целочисленному типу (T3). Правила продвижения для сравнения со знаком / без знака, к сожалению, всегда соответствуют типу без знака.
Итак, как мне найти тип T3 в C++11/C++14/C++17, который охватывает два целочисленных типа T1 и T2, независимо от того, какой у них размер и подпись? Если это невозможно, есть ли другое решение для построения функции сравнения на основе шаблонов, которая надежно работает с любой целочисленной комбинацией?
2 ответа
Вы можете разбить сравнение на части. Сначала проверьте, является ли одно число отрицательным, а другое положительным. Если это так, вы знаете, в каком порядке они идут. Если ни один из них не является отрицательным (или оба являются отрицательными), просто выполните обычное сравнение.
Это может быть встроено в шаблонную функцию, которая будет проверять только наличие отрицательных подписанных типов.
Я не уверен, что понимаю ваш вопрос. Вы имеете в виду что-то вроде этого:
#include <cstdint>
#include <type_traits>
template < typename P, typename Q >
auto
compare( P p, Q q ) {
using T = typename std::common_type< P, Q >::type;
T promoted_p{p};
T promoted_q{q};
if ( promoted_p < promoted_q ) {
return -1;
}
else if ( promoted_p > promoted_q ) {
return 1;
}
else {
return 0;
}
}
Это будет работать, когда это безопасно, и вы можете добавить свои специализации, если язык не делает то, что вы хотите.