Функция шаблона 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;
  }
}

Это будет работать, когда это безопасно, и вы можете добавить свои специализации, если язык не делает то, что вы хотите.

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