Здравствуйте, 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... Программа превращается в зоопарк монстров. Концепты же для того и придумывались, чтоб этого всего не было. Чтоб можно было реализовывать обобщенные алгоритмы, применимые как пользовательским класам, так и к встроенными и библиотечным типам.
Я бы, все-таки, пошерстил дизайн на предмет циклических зависимостей.