Size: a a a

2021 March 24

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Danya
enum class Foo : int {};
enum class Bar : int {};
Для строк часто используется, их в енам не сунешь
источник

A

Alex in pro.cxx
для строк? Это как? Прямо enum class Foo : std::string {}; ?
источник

A

Alex in pro.cxx
а, я аж удивился)
источник

S

Sergey in pro.cxx
Александр Караев
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/

Конкретных свежих пропозалов в стандарт я не нашёл, увы.
Наследоваться можно запретить, как у примитивных типов. Алиасинг тоже как у примитивных. Почему это всё должно отличаться от примитивных типов?

Конструирование/присваивание/мув максимально явны.

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

A

Alex in pro.cxx
А нельзя сделать struct Foo : private std::string {}; и через using подтянуть нужные базовые методы в паблик? или так не дозволено управлять видимостью методов?
источник

D

Danya in pro.cxx
Alex
А нельзя сделать struct Foo : private std::string {}; и через using подтянуть нужные базовые методы в паблик? или так не дозволено управлять видимостью методов?
А ты попробовал?
источник

D

Danya in pro.cxx
Но наверное надо сделать protected наследование
источник

D

Danya in pro.cxx
И тогда может быть получится
источник

D

Danya in pro.cxx
С private точно нет
источник

АК

Александр Караев... in pro.cxx
Alex
А нельзя сделать struct Foo : private std::string {}; и через using подтянуть нужные базовые методы в паблик? или так не дозволено управлять видимостью методов?
Управлять видимостью через using можно
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Danya
Но наверное надо сделать protected наследование
А разница?
источник

DF

Dollar Føølish in pro.cxx
Александр Караев
Управлять видимостью через using можно
+++
источник

DF

Dollar Føølish in pro.cxx
Но класс строки по моему файнал
источник

DF

Dollar Føølish in pro.cxx
Или я путаю
источник

ПК

Побитый Кирпич... in pro.cxx
Sergey
Не обязательно же такой синтаксис как я предложил.
Можно что-то вроде

strong using Foo = int;

или что-нибудь со старыми ключевыми словами, чтоб не совсем не ломать:

using class Foo = int; // По аналогии с "сильным" enum class.
Скорее explicit using
источник

D

Danya in pro.cxx
Artöm Bakri Al-Sarmini
А разница?
Ну так у тебя при приватном наследовании разве будут доступны члены строки?
источник

D

Danya in pro.cxx
Dollar Føølish
Но класс строки по моему файнал
В стдлибе ничего не final
Как минимум не final всё, что было с С++98
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Danya
Ну так у тебя при приватном наследовании разве будут доступны члены строки?
В наследнике? Да
источник

D

Danya in pro.cxx
Artöm Bakri Al-Sarmini
В наследнике? Да
А, я наверное немного попутал, сорри
private норм, да
источник

ПК

Побитый Кирпич... in pro.cxx
Sergey
Пишут что ничего:

https://www.fluentcpp.com/2017/05/05/news-strong-types-are-free/

Я наши обёртки дизассемблировал в простых случаях - тоже от простых типов не отличалось.
Что, и в дебаге нет оверхеда?
источник