Функция шаблона C ++ для сравнения любых целых чисел без знака и со знаком - PullRequest
0 голосов
/ 28 октября 2018

Я хотел бы реализовать шаблонную функцию, которая сравнивает две переменные двух типов (T1 и T2).Эти типы являются двумя случайными целыми типами без знака или со знаком.

Чтобы иметь возможность их правильно сравнивать, мне нужно привести их оба к целочисленному типу «большего размера» (T3).Правила продвижения для сравнения со знаком и без знака, к сожалению, всегда приводят к типу без знака.

Итак, как мне найти тип T3 в C ++ 11 / C ++ 14 / C ++ 17, который охватывает два целочисленных типа T1и T2, независимо от того, какой размер и подпись они имеют?Если это невозможно, существует ли другое решение для создания функции сравнения на основе шаблонов, которая надежно работает с любой целочисленной комбинацией?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

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

Это может быть встроено в функцию шаблона, которая будет проверять только отрицательный результатподписанные типы.

0 голосов
/ 28 октября 2018

Я не уверен, что понимаю ваш вопрос.Вы имеете в виду что-то вроде этого:

#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;
  }
}

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

...