С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 56

Использование класса numeric_limits

07.01.2022, 19:35. Показов 1843. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с подобной конструкцией впервые. Встретил это в <limits>. Искал как запилить максимально возможное значение в переменную, наткнулся на этот заголовочный файл. В нем имеется конструкция
C++
1
2
3
4
5
6
7
8
9
10
11
class numeric_limits<int> : public _Num_int_base {
public:
    _NODISCARD static constexpr int(min)() noexcept {
        return INT_MIN;
    }
 
    _NODISCARD static constexpr int(max)() noexcept {
        return INT_MAX;
    }
//...................................................................................
}
Там где я наткнулся на данный заголовочный файл предлагалось сделать так
C++
1
max = std::numeric_limits<int>::max();
попытался, ничего не вышло, решил проверить, что вообще возвращает эта штука и через auto выяснил, что вроде это как ссылка на функцию получается, да и ведет оно себя соответственно, получилось вызвать то, что нужно.
C++
1
2
    auto getMax = std::numeric_limits<int>::max;
    int max = getMax();
Подскажите пожалуйста, можно ли вызвать данную функцию без ввода дополнительной переменной, getMax в моем случае?
И как вообще называется подобная конструкция, не встречал раньше такого, может подскажите, где почитать про нее.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2022, 19:35
Ответы с готовыми решениями:

Использование объекта одного класса при создании нового класса
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...

Использование в качестве поля класса указатель на объект другого класса
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

Использование указателя на функцию не члена класса внутри класса
Я создаю внешний класс, который содержит другие (внутренние) классы - обработчики данных. Внешний класс загружает DLL, из которой...

15
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
07.01.2022, 19:42
Цитата Сообщение от snoogens Посмотреть сообщение
попытался, ничего не вышло
А подробнее?
C++
1
2
3
4
5
6
7
#include <limits>
#include <iostream>
 
int main()
{
    std::cout << std::numeric_limits<int>::max();
}
0
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
07.01.2022, 19:43
Вы немного ошиблись, поэтому у вас и получилась ссылка на функцию
Цитата Сообщение от snoogens Посмотреть сообщение
::max()
Цитата Сообщение от snoogens Посмотреть сообщение
::max
0
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 56
07.01.2022, 20:17  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
А подробнее?
мне нужно инициализировать мою переменную интовую максимальным значением, я пытался сделать, как писал ранее
C++
1
int max = std::numeric_limits<int>::max();
компилятор выдает соответствующее сообщение, что это ссылка, а я ее в инт пихаю.
конкретно... я хочу инициализировать мою переменную int max максимально возможным для int значением, что-то вроде того, как я сделал это сейчас, а именно:
C++
1
2
auto getMax = std::numeric_limits<int>::max;
int max = getMax();
только без ввода дополнительной переменной ссылки getMax.

Добавлено через 10 минут
Чет напортачил где-то. Создал новый проект, там все работает......

Добавлено через 6 минут
Нашел, в чем была проблема, все чинится, если удалить включенный
C++
1
#include <windows.h>
Добавлено через 2 минуты
Но на счет самой конструкции все еще остается не понятно и почему мешает windows.h
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
07.01.2022, 21:05
Цитата Сообщение от snoogens Посмотреть сообщение
Нашел, в чем была проблема, все чинится, если удалить включенный
наверное, там есть #define max(a, b) ...
https://docs.microsoft.com/en-... imedia/max
хотя ошибка странная. лучше бы текст прямо привели.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,209
07.01.2022, 21:17
Цитата Сообщение от snoogens Посмотреть сообщение
мне нужно инициализировать мою переменную интовую максимальным значением, я пытался сделать, как писал ранее
C++
1
int max = std::numeric_limits<int>::max();
компилятор выдает соответствующее сообщение, что это ссылка, а я ее в инт пихаю.
Ну так приведите реальный код и точную цитату сообщения компилятора. Скорее всего вы что-то выдумываете.

Почему вы до сих пор не процитировали дословно сообщение компилятора?

Цитата Сообщение от snoogens Посмотреть сообщение
Нашел, в чем была проблема, все чинится, если удалить включенный
C++
1
#include <windows.h>
Но на счет самой конструкции все еще остается не понятно и почему мешает windows.h
windows.h может мешать потому, что там определены макросы min и max, но сообщения об ошибках из-за этого будут совсем другими. Вы же нам рассказываете про некое "компилятор выдает сообщение, что это ссылка". То есть велика вероятность, что вы все таки что-то выдумываете.
0
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 56
07.01.2022, 21:33  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
наверное, там есть #define max(a, b) ...
если в вижле навести на красное подчеркивание, оно об этом говорит, вы правы...
И получается этот max заменяется на то, что определяет макрос... ок.
GbaLog-, но тогда почему все нормально работает, если пойти путем, которым я добился желаемого результата
C++
1
auto getMax = std::numeric_limits<int>::max;
В getMax я получаю ссылку на требуемую мне функцию. Тут макрос не вызывается почему то...

Добавлено через 4 минуты
TheCalligrapher, ошибки компилятора:
Кликните здесь для просмотра всего текста
Severity Code Description Project File Line Suppression State
Error C2062 type 'unknown-type' unexpected ConsoleApplication3 C:\Users\snooch_book\source\repos\Consol eApplication3\ConsoleApplication3\Consol eApplication3.cpp 32
Error C2059 syntax error: ')' ConsoleApplication3 C:\Users\snooch_book\source\repos\Consol eApplication3\ConsoleApplication3\Consol eApplication3.cpp 32
Error C2589 '(': illegal token on right side of '::' ConsoleApplication3 C:\Users\snooch_book\source\repos\Consol eApplication3\ConsoleApplication3\Consol eApplication3.cpp 32
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
07.01.2022, 21:44
Цитата Сообщение от snoogens Посмотреть сообщение
но тогда почему все нормально работает, если пойти путем, которым я добился желаемого результата
потому что макрос определён с параметрами.
когда пишется не max(), а max, то компилятор видит, что параметров нет и значит это не использование макроса.
1
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 56
07.01.2022, 21:48  [ТС]
GbaLog-, в точку, спасибо, я вышел из тупняка.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,209
07.01.2022, 22:07
Цитата Сообщение от snoogens Посмотреть сообщение
ошибки компилятора:
Code
1
2
3
4
Severity    Code    Description Project File    Line    Suppression State
Error   C2062   type 'unknown-type' unexpected  ConsoleApplication3 C:\Users\snooch_book\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp   32  
Error   C2059   syntax error: ')'   ConsoleApplication3 C:\Users\snooch_book\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp   32  
Error   C2589   '(': illegal token on right side of '::'    ConsoleApplication3 C:\Users\snooch_book\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp   32
И? Вы нам выше рассказывали, что "компилятор выдает соответствующее сообщение, что это ссылка, а я ее в инт пихаю."

Но я не вижу ничего подобного среди процитированных сообщений. Никаких "ссылок" в них не упоминается. И про "инт" нет ни слова.
0
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 56
08.01.2022, 00:02  [ТС]
TheCalligrapher, вы правы, это было, когда я пытался сделать следующее
C++
1
int max = std::numeric_limits<int>::max;
Severity Code Description Project File Line Suppression State
Error (active) E0144 a value of type "int (*)() noexcept" cannot be used to initialize an entity of type "int"

Добавлено через 7 минут
но сути это не меняет, что происходило я уже понял, а вот зачем они объявили функции подобным образом нет(
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.01.2022, 00:36
Цитата Сообщение от snoogens Посмотреть сообщение
а вот зачем они объявили функции подобным образом нет
Кто эти "они" и о каких функциях речь?
0
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 56
08.01.2022, 00:50  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Кто эти "они" и о каких функциях речь?
функция в начале темы. Они, кто написал их, почему не сделать как обычную функцию, а делают такого вида, я же писал выше, что хочу понять, что это за конструкция
C++
1
2
3
static constexpr int(min)() noexcept {
        return INT_MIN;
    }
может нельзя было сделать так
C++
1
2
3
static constexpr int min() noexcept {
        return INT_MIN;
   }
или это тоже самое и просто другой вариант записи.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,209
08.01.2022, 00:53
Лучший ответ Сообщение было отмечено snoogens как решение

Решение

Цитата Сообщение от snoogens Посмотреть сообщение
ну те, кто написал их, почему не сделать как обычную функцию
Кого "их"? Макросы? Или функции из std::numeric_limits?

Цитата Сообщение от snoogens Посмотреть сообщение
C++
1
static constexpr int(min)() noexcept
Так это и есть "обычная функция".

Цитата Сообщение от snoogens Посмотреть сообщение
может нельзя было сделать так
C++
1
static constexpr int min() noexcept {
Нельзя было именно для того, чтобы не нарваться на ту же самую проблему с макросами. Дополнительные () как раз решают эту проблему.

Вы тоже можете воспользоваться этим методом с лишней парой () для решения проблемы

C++
1
int max = (std::numeric_limits<int>::max)();
1
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 56
08.01.2022, 01:08  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
int max = (std::numeric_limits<int>::max)();
вот оно. Спасибо.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.01.2022, 12:21
Вы можете определить макрос NOMINMAX, тогда макросы min и max из windows.h не просочатся в ваш код.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2022, 12:21
Помогаю со студенческими работами здесь

numeric_limits и int8_t
Eсли скомпилировать и запустить auto max = numeric_limits&lt;int8_t&gt;::max(); cout &lt;&lt; max &lt;&lt; endl &lt;&lt; sizeof(max) &lt;&lt; endl; ...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

Использование класса как переменной другого класса
Приветствую! Кто-нибудь может объяснить вопрос, заданный в теме? Как объявлять такую переменную, брать и забирать из нее данные? Можете...

не работает numeric_limits<char>
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;iomanip&gt; #include &lt;limits&gt; using namespace std; int main() { system(&quot;chcp...

numeric_limits<unsigned int>::digits
при запуске такой скомпилиной проги на 32р. системе должно вывести bits in int: 32 а при запуске на 64р. системе bits in int: 64 так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru