и ошибок)) Но вот вопрос. Есть функция:
int inputfirstsystem(string allowed) // Ввод системы
{
int system = 0;
string systemstring;
cout << "\nВведите исходную систему: ";
getline(cin, systemstring);
if (check(systemstring, allowed) == 1) // Проверка строки
{
inputfirstsystem(allowed);
return system;
}
system = toDec(systemstring, 10); // Перевод строки в число
if (system < 2 || system > 16)
{
cout << "\nВведите значение от 2 до 16!\n";
inputfirstsystem(allowed);
return system;
}
return system;
}
https://prnt.sc/102pidu Через отладчик проверил, что при таком вводе, когда несколько раз неправильно, а потом правильно (10), выводится все хорошо, но вот возвращает в функцию, где она вызывается, не 10, а 0. Как быть? Чтоб 10 возвращалось.
та же проблема
вам в функциональное программирование надо попробовать, ход мысли как раз туда =)
вероятно, заменить inputfirstsystem(allowed); return system; на return inputfirstsystem(allowed);
я только учусь)
Фп пригодится в любом случае
Сейчас ФП в плюсах получше, чем во времена C++03, но, все равно по большей части смертоубийство, может в С++26 или C++30 станет удобней, а может появится что-то еще и мода на ФП пройдет. Просто для справки: 1 что есть из ФП в C++ - Функции как объект первого класса (а значит, функции высшего порядка), декомпозиция POD, лямбды, автоматический вывод типов (но синтаксис многословный аки java, раньше везде был явный тип теперь везде auto, видел сравнение плюсов с каким то ФП языком (кажется, Scala - auto вместо val просто убило). Чего нет из ФП - тайпклассы (можно организовать похожее поведение, но в большинстве случаев вынос мозга гарантирован), паттерн-матчинг (Страуструп и студенты пытаются придумать, последнее что я видел, мозг не выносит, но делает очень много лишних движений), каррирование (если очень хочется, то можно, но сложно).
Я бы добавил сюда ленивость и шаблоны. Да и тайпклассы действительно можно организовать, но да, не хватает, конечно
Вот кстати, интересно стало: в C++ шаблоны всегда инвариантны или есть какой-то способ это обойти?
Если я правильно понимаю, то не знаю как обойти, по крайней мере
Тот же shared_ptr или аллокаторы это обходит всё же как-то, если подумать
С другой стороны, типы-то всё равно инвариантны
Ну вот и мне так кажется, похожего поведения можно добиться определя приведения типов явно, но обобщенного способа пока нет...
А можно небольшое пояснение, что имеется ввиду под инвариантностью шаблонов?
если как нибудь оператор приведения написать используя метапрогу, вроде должно выйти не?
Да, я вроде выше так и написал - выводить приведение самому как-то.
Извини, сейчас немного занят, если нужны детали - чуть позже, или кто-то еще сможет ответить.
Спасибо, я нужную информацию нашёл. Пока что я также склоняюсь к оператору приведения. Код более или менее выразительным можно сделать за счёт шаблонов, да
Если я правильно понял саму концепцию (без подготовки сходу оказалось непросто переложить концепцию полиморфизма через трейты на плюсовый полиморфизм через наследование), то можно сделать CRTP-обёртку, которая заставит наши типы вести себя как какой-то другой тип (например, какой-нибудь из стандартных контейнеров). Вот пример реализации такой обёртки для контейнеров. Новый контейнер, поддерживающий выбор вариантности пишется в 4 строки, ведя при этом как настоящий. При желании можно и что-то более обобщённое написать Ну и очевидное наблюдение — стандартные умные указатели изначально не инвариантны ¯\_(ツ)_/¯ На что я только убил последние часа 3 своего существования...
А можно для самых маленьких, в чем там неинвариантность?
По умолчанию все инстансы шаблонов в C++ инвариантны и следующий код не работает std::vector<Base> x = std::vector<Derived>{}; Я привёл пример обёртки, которая позволяет написать свои контейнеры, позволяющие выбрать поведение одним из двух способов (указать, что исходный вектор ковариантен или указать, что вектор назначения контравариантен)
Я так и думал, спасибо. Только вашем примере разные инстансы, а не шаблоны)
Да, пожалуй, у меня в формулировке закралась ошибка
Ничего не смертоубийство, с ranges так вообще огонь, да ещё и stl на место ставит
Обсуждают сегодня