Есть ли способ определить ‘int’ через ‘больше / меньше, чем’ вместо ‘=’?

#c #int

#c #int

Вопрос:

Я играл в задаче на каком-то веб-сайте, и я столкнулся с этой проблемой. у меня есть неопознанное целое число… только я знаю, что это больше, чем x или и меньше, чем y и так далее… есть ли способ определить переменную на основе so? … Я имею в виду, что значение больше меньше целого числа..

некоторые отметили, что not_null помогло бы, но я не мог понять, как..

вот какой-то глупый пример :

 int some_unknown_number > 8;
if [some_unknown_number<=1] 
    {cout << "wrong" << endl;}
  

итак, я ожидаю, что код распознает, что some_unknown_number не может быть меньше 1, поскольку он уже больше 8….

ps: Мне не нужен точный ответ… просто скажите мне, где искать, если вы понимаете, что я имею в виду….

Комментарии:

1. int может быть только одним конкретным целым числом. Похоже, у вас есть диапазон возможных значений. Неясно, что вы хотите сделать с some_unknown_number , поэтому мне нужно больше деталей, чтобы иметь возможность помочь.

2. = произносится как «присваивать», а не «равно»

3. Вы можете определить свой собственный тип с таким требованием

4. Я не хочу ничего делать с some_unknown_number, кроме проверки некоторых логических параметров, таких как больше или меньше некоторых чисел на основе других логических параметров…

Ответ №1:

Вы могли бы создать класс, представляющий это как

 struct bounded
{
    std::optional<int> m_lower;
    std::optional<int> m_higher;
};
  

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

Затем вы создаете свой < operator amp; c. в соответствии с этой моделью.

Комментарии:

1. бонусные баллы: включите counting_iterator begin() и counting_iterator end() и получите циклы for со всеми числами, которые удовлетворяют условию

2. У меня нет точного диапазона… просто верхний или нижний предел диапазона … Сработает ли это, если у меня будет только один из них?

3. @Andrew_Jacop: Конечно, именно поэтому я использую std::optional .

4. @Andrew_Jacop да, вы бы использовали m_lower.value_or(std::numeric_limits<int>::min()) и m_higher.value_or(std::numeric_limits<int>::max()) в сравнениях

Ответ №2:

Действительно, интересный вопрос. Вы можете определить свой тип. Например:

 template<int Min, int Max>
struct Int
{
  static_assert(Max > Min, "Max should be greater than Min");

  bool operator<(int val) const
  {
    return val > Max;
  }

  bool operator>(int val) const
  {
    return Min > val;
  }
};
  

При необходимости вы можете добавить больше операторов, чтобы определить необходимую семантику, и использовать ее как:

 // Int<19, 1> wrongInt; <--- compile time error.

Int<1, 3> myInt;
if (myInt > 0)
  printf("Greater than 0n");

if (myInt < 5)
  printf("Less than 5n");
  

Комментарии:

1. Почему параметры шаблона?

2. @Caleth, потому что Int<1, 3> это новый тип. Статический тип.

3. Вам не нужны члены m_min и m_max . На самом деле вы разрушаете constexpr , если сохраняете их. Хотя идея хорошая. Готовимся к голосованию.

4. тот же вопрос, что и предыдущий ответ… сработает ли это, если у меня будет только одно ограничение? У меня есть либо ‘max’, либо ‘min’ … не оба

5. @vahancho: Но они вам вообще не нужны, просто используйте Max и Min .