Информация об изменениях

Сообщение Re[2]: Проверка концептов внутри типа от 10.12.2024 12:15

Изменено 10.12.2024 13:08 rg45

Re[2]: Проверка концептов внутри типа
Здравствуйте, sergii.p, Вы писали:

SP>
SP>template<typename T>
SP>concept cloneable = requires (T x) {
SP>    static_cast<Clonable<T>>(x);
SP>};
SP>


Тогда уж проще:

template<typename T>
concept cloneable = std::derived_from<T, Cloneable<T>>;


Только закладывать в концепт наследование от конкретного класса — идея так себе, по-моему. Если на каждый концепт заводить по базовому классу — Cloneable, Printable, Loggagle, Serializable, Drawable, Sendable, Receivable, Insertable, Extractable... Программа превращается в зоопарк монстров. Концепты же для того и придумывались, чтоб этого всего не было, чтобы можно было реализовывать обобщенные алгоритмы, применимые как пользовательским класам, так и к встроенными и библиотечным типам.

Я бы, все-таки, пошерстил дизайн на предмет циклических зависимостей.
Re[2]: Проверка концептов внутри типа
Здравствуйте, sergii.p, Вы писали:

SP>
SP>template<typename T>
SP>concept cloneable = requires (T x) {
SP>    static_cast<Clonable<T>>(x);
SP>};
SP>


Тогда уж проще:

template<typename T>
concept cloneable = std::derived_from<T, Cloneable<T>>;


Только закладывать в концепт наследование от конкретного класса — идея так себе, по-моему. Если на каждый концепт заводить по базовому классу — Cloneable, Printable, Loggagle, Serializable, Drawable, Sendable, Receivable, Insertable, Extractable... Программа превращается в зоопарк монстров. Концепты же для того и придумывались, чтоб этого всего не было. Чтоб можно было реализовывать обобщенные алгоритмы, применимые как пользовательским класам, так и к встроенными и библиотечным типам.

Я бы, все-таки, пошерстил дизайн на предмет циклических зависимостей.