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 ответов

13 просмотров

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

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

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 {};

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта