Size: a a a

2021 March 24

PZ

Pavel Zhigulin in pro.cxx
Ilia Zviagin
Так уже сейчас есть, только вместо using надо enum class
И как это будет работать, можно пример? Разве после

enum class Foo : int {};
enum class Bar : int {};
источник

PZ

Pavel Zhigulin in pro.cxx
Это будет валидно?

Foo value = 50;
Bar value = 60;
источник

АК

Александр Караев... in pro.cxx
Pavel Zhigulin
Это будет валидно?

Foo value = 50;
Bar value = 60;
То есть void foo(Foo); foo(50) - это хороший код? :)
источник

PZ

Pavel Zhigulin in pro.cxx
Александр Караев
В документации я тоже найти не могу, но этот вопрос можно задать для любого view. Они все обладают свойством частичного применения с дальнейшим использованием в виде range | some_view(...)
И откуда я должен познать эту истину по мнению cppreference, интересно :)
источник

PZ

Pavel Zhigulin in pro.cxx
Александр Караев
То есть void foo(Foo); foo(50) - это хороший код? :)
Вопрос не в хорошести. Вопрос в валидности. Насколько мне помнится, присваивать enum-у значение, которое в нём не определено - это UB.
источник

АК

Александр Караев... in pro.cxx
Pavel Zhigulin
Вопрос не в хорошести. Вопрос в валидности. Насколько мне помнится, присваивать enum-у значение, которое в нём не определено - это UB.
Всё будет валидно, если поправить на Foo value = Foo{50} (см. std::byte)
источник

IZ

Ilia Zviagin in pro.cxx
Pavel Zhigulin
Это будет валидно?

Foo value = 50;
Bar value = 60;
Я так понял, что ты хочешь, чтобы это было бы НЕВАЛИДНО, нет?
источник

PZ

Pavel Zhigulin in pro.cxx
+ enum class не решает проблему typedef-ов от кастомных и даже хотя бы неитегральных типов
источник

PZ

Pavel Zhigulin in pro.cxx
Ilia Zviagin
Я так понял, что ты хочешь, чтобы это было бы НЕВАЛИДНО, нет?
Изначальный запрос был в том, чтобы оба типа вели себя как обычный тип, но нельзя было сконвертировать один в другой:

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&)
источник

PZ

Pavel Zhigulin in pro.cxx
Александр Караев
В документации я тоже найти не могу, но этот вопрос можно задать для любого view. Они все обладают свойством частичного применения с дальнейшим использованием в виде range | some_view(...)
источник

AU

Abu Umar in pro.cxx
Pavel Zhigulin
Вопрос не в хорошести. Вопрос в валидности. Насколько мне помнится, присваивать enum-у значение, которое в нём не определено - это UB.
If the underlying type is not fixed and the source value is out of range, the result is unspecified (until C++17)undefined (since C++17). (The source value, as converted to the enumeration's underlying type if floating-point, is in range if it would fit in the smallest bit field large enough to hold all enumerators of the target enumeration.) Otherwise, the result is the same as the result of implicit conversion to the underlying type.
источник

IZ

Ilia Zviagin in pro.cxx
Pavel Zhigulin
Изначальный запрос был в том, чтобы оба типа вели себя как обычный тип, но нельзя было сконвертировать один в другой:

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&)
Ну, enum же
источник

AP

Antony Polukhin in pro.cxx
magras
Можно в начале все разделители свести к одному и потом применять один сплит: https://godbolt.org/z/M1sc1Tzvv
Но вообще я тоже считаю что правильное решение split_when. Если его еще нет в стандарте, надо написать свой.
О! Спасибо. Кажется что оно даже за 1 проход работает, так что всё не так страшно
источник

PZ

Pavel Zhigulin in pro.cxx
Abu Umar
If the underlying type is not fixed and the source value is out of range, the result is unspecified (until C++17)undefined (since C++17). (The source value, as converted to the enumeration's underlying type if floating-point, is in range if it would fit in the smallest bit field large enough to hold all enumerators of the target enumeration.) Otherwise, the result is the same as the result of implicit conversion to the underlying type.
Ок, спасибо, буду иметь ввиду.
источник

IZ

Ilia Zviagin in pro.cxx
Pavel Zhigulin
Изначальный запрос был в том, чтобы оба типа вели себя как обычный тип, но нельзя было сконвертировать один в другой:

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&)
А ещё можно очень быстро налепить аналогичный класс.
Ну, два в смысле. Или один шаблонный и инстанциировать.

Ну и ты конечно понимаешь, что ты занимаешься полной ерундой, а именно:
приписываешь существующим конструкциям языка несвойственные им возможности и назначение.
источник

PZ

Pavel Zhigulin in pro.cxx
Ilia Zviagin
Ну, enum же
Что если я хочу вот такое:

using Foo = std::string;
using Bar = std::string;
Foo foo = "hello";
Bar bar = foo; // Error: could not cast Foo to const Bar& in Bar::Bar(const Bar&)
источник

IZ

Ilia Zviagin in pro.cxx
Pavel Zhigulin
Что если я хочу вот такое:

using Foo = std::string;
using Bar = std::string;
Foo foo = "hello";
Bar bar = foo; // Error: could not cast Foo to const Bar& in Bar::Bar(const Bar&)
Вот как раз выше дал тебе ответ...
источник

PZ

Pavel Zhigulin in pro.cxx
Ilia Zviagin
А ещё можно очень быстро налепить аналогичный класс.
Ну, два в смысле. Или один шаблонный и инстанциировать.

Ну и ты конечно понимаешь, что ты занимаешься полной ерундой, а именно:
приписываешь существующим конструкциям языка несвойственные им возможности и назначение.
Это не я :) Там выше по переписке уже привели пример библиотеки, которая решают эту задачу (плохо и некрасиво решает, но решает). В моей работе я не припомню, чтобы мне уж очень сильно нужен был strong typedef
источник

IZ

Ilia Zviagin in pro.cxx
Pavel Zhigulin
Что если я хочу вот такое:

using Foo = std::string;
using Bar = std::string;
Foo foo = "hello";
Bar bar = foo; // Error: could not cast Foo to const Bar& in Bar::Bar(const Bar&)
Ты мультик про циплёнка смотрел, да ?
"Кокое всё зелёное, коко..." и так далее.
Что лиса говорила?
источник

VV

Vadim Volodin in pro.cxx
Всем привет!
Хотелось бы сделать релиз для линукса в виде архивчика, который можно скачать и сразу запустить программу, возможно с некоторой установкой, но без использования sudo, то есть не может быть установлен в дефолтные директории (/usr/bin и т.д.). В частности, архивчик должен включать в себя такие пакеты, как build-essential, python3, cmake и другие.
Вот пример проблемы, которая возникает:
Можно устанавливать binutils так (часть build-essential):
apt source binutils && cd binutils-2.34
./configure --prefix=/path/to/predefined/directory
make && make install
Но в таком случае архивчик нужно будет скачивать только в определенную директорию.
Есть у кого-то опыт в таком? Как сделать такой архивчик?
источник