#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
.