问题描述
我如何在UML类图中绘制C ++概念?
template<typename T>
concept Printable = requires(T a,std::ostream &where) {
{ where << a };
};
template<typename T>
concept Identifiable = requires(T a) {
{ a.getId() } -> std::convertible_to<std::string>;
};
template<typename T>
concept Listable = Identifiable<T> && Printable<T>;
然后是课程:
template<Listable T>
class Liste {
...
void add(T *data);
...
}
如果这是一个常规模板,我只需将T
放在班级角落的正方形中。但是这些概念呢?
解决方法
C++ concepts定义了与模板类关联的类型的约束:
-
由于UML支持class template,因此通常可以使用自然语言或OCL在大括号之间将其constraints表示为参数。前者在早期设计阶段是完美的。但是,如果需要这种准确性,您也可以考虑使用与C ++相同的语法而不是自然语言来实用地表达它。
-
或者,您也可以将C ++概念作为UML中的一种通用类型来处理。然后,您可以在类模板中模板参数的类型定义中以更易读的方式使用该概念。这将更方便阅读,并且更接近C ++的想法。问题在于,在UML中没有预见到定义此类通用类型的任何事情。因此,您可以使用临时profile扩展UML以使用
«concept»
stereotype。然后,您将定义与类完全相同的概念,使用UML constraints定义约束,并使用UML class templates中的概念。
在这里,第二种方法是什么样子。请注意两个概念之间的实现dependency: