170 похожих чатов

Кто нибудь знает, ожидается ли в пост-С++20 стандартах сильная типизация

в духе
using Foo = int;
using Bar = int;
Foo foo = 0;
Bar bar = foo; // Error: could not cast Foo to const Bar& in Bar::Bar(const Bar&)
?

17 ответов

15 просмотров

Нет, это решается библиотеками

Я боюсь это никогда не появится, ибо сломает тонны кода.

Sergey- Автор вопроса
Pavel Zhigulin
Я боюсь это никогда не появится, ибо сломает тонны...

Не обязательно же такой синтаксис как я предложил. Можно что-то вроде strong using Foo = int; или что-нибудь со старыми ключевыми словами, чтоб не совсем не ломать: using class Foo = int; // По аналогии с "сильным" enum class.

Были предложения, обычно такое называется strong typedef. И все предложения рушатся вопросами: 0. Должна ли конвертация из int в Foo или Bar быть явной или неявной? А наоборот? А между ними? 1. Должен ли operator== работать "из коробки" для таких типов (в том числе комбинации int==Foo, Foo==Bar)? 2. Должен ли std::hash работать также, как для оригинального типа? 3. Должны ли поддерживаться арифметические операции для Foo, у которого "базовый" тип их поддерживает? 4. Если ответы на все вопросы выше - нет, то почему нельзя взять struct Foo { int value; }? P.S. Вообще, ответы на все эти вопросы у каждого свои, а универсального решения придумать не смогли

Sergey- Автор вопроса
Alexander Karaev
Были предложения, обычно такое называется strong t...

Спасибо. Мне кажется, на вопросы 1 и 3 ответ должен быть "да", иначе используйте обычный using/typedef. А есть ли где нибудь лог обсуждения со всем списком подобных вопросов? Чтобы будущие предложения на них заранее ответили.

Sergey- Автор вопроса
Alexander Karaev
Были предложения, обычно такое называется strong t...

0 - все конвертации максимально явные, почти как в Аде.

Alexander Karaev
Были предложения, обычно такое называется strong t...

0. Явная. 1. Да. Сравнения допустимы. Но через тег опцианальны. 2. Нет, это разные типы. С разными констрейнтами. 3. Да. Итого - Ada Language, SubType Idiom.

Wild_Wind
0. Явная. 1. Да. Сравнения допустимы. Но через тег...

Осталось только контракты навешать.

Wild_Wind
0. Явная. 1. Да. Сравнения допустимы. Но через тег...

0. Почему? 1. Почему? 2. Почему? 3. Точно? А если у меня using strong user_id = int, что такое user_id{1} + user_id{2}? Или user_id{5} * user_id{7}? Все эти вопросы скорее риторические, на них не нужно отвечать (всё, что пришло мне в голову сходу, на самом деле можно приплести много чего ещё - операторы сравнения, поведение при наследовании, правила алиасинга, всякие там friend'ы и т.д...). Просто для каждой задачи, как выяснилось, нужно что-то своё. Есть классный пост на эту тему - https://foonathan.net/2016/10/strong-typedefs/ Конкретных свежих пропозалов в стандарт я не нашёл, увы.

Alexander Karaev
0. Почему? 1. Почему? 2. Почему? 3. Точно? А если ...

0. Разве не ради этого всё и задумывалось? Чтоб нельзя было положить FirstName в SecondName? 1. Типы разные, неявное сравнение недопустимо, ты прав. Иначе отстрел ног на ровном месте. 2,3 - ХЗ, от ситуации зависти, я б напилил концептов с разынми policy.

enum class Foo : int {}; enum class Bar : int {};

Danya🔥
enum class Foo : int {}; enum class Bar : int {};

Для строк часто используется, их в енам не сунешь

Sergey- Автор вопроса
Alexander Karaev
0. Почему? 1. Почему? 2. Почему? 3. Точно? А если ...

Наследоваться можно запретить, как у примитивных типов. Алиасинг тоже как у примитивных. Почему это всё должно отличаться от примитивных типов? Конструирование/присваивание/мув максимально явны. Арифметику и сравнения можно запретить по дефолту, но сделать лёгкий синтаксис для их быстрого включения, вроде operator+(Foo, Bar); // Теперь ниже объявления (или во всей единице трансляции?) эти типы можно складывать.

Так уже сейчас есть, только вместо using надо enum class

Ilya Zviagin
Так уже сейчас есть, только вместо using надо enum...

И как это будет работать, можно пример? Разве после enum class Foo : int {}; enum class Bar : int {};

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта