Здравствуйте, sergii.p, Вы писали:
R>>R>>template<typename T>
R>>concept cloneable = std::derived_from<T, Cloneable<T>>;
R>>
SP>лично у меня не скомпилировалось. Похоже derived_from требует полного типа.
А, ну да. Ну это и не принципиально. По семантике это, так или иначе, требование наследования.
SP>я всегда их понимал как одно и тоже. В Rust трейты — фактически реализация наследования. Но в тоже время — это не что иное как концепты. В общем не вижу ничего плохого в смешении.
В смешении в смысле совместного использования ничего страшного и нет. А вот когда в концепт заложено требование наследования — это сразу же наламывает принцип обобщённости. Взять тот же cloneable — почему бы мне не сделать клонируемыми, например, классы стандартных контейнеров, у которых типы элементов отвечают требованиям этого концепта? Ну да, для этого в концепте не следует закладываться и на функции-члены. Но это уже зло меньшего порядка, чем наследование, это легче исправить.