奇怪的重复模板模式的UML图 如何正确绘制C++的递归模板模式(CRTP)的UML图,而不为每个继承类复制基类,即反映实现而不是编译后的情况的方法?

奇怪的重复模板模式的UML图 如何正确绘制C++的递归模板模式(CRTP)的UML图,而不为每个继承类复制基类,即反映实现而不是编译后的情况的方法?,c++,uml,C++,Uml,问题归结为:如果模板参数可以是一组派生类的任何一个,那么我应该写进普通模板基础类的虚线框中?如在另一个答案中所说的,C++奇怪的模板模板(CRTP)的例子是: 模板 阶级基础 { //基类中的方法可以使用模板访问派生类的成员 }; 派生类:公共基 { // ... }; 如果模板参数可以是整个派生类集合中的任何一个,那么我应该在公共模板基类的虚线框中写入什么 模板类的虚线框显示了模板参数(对于类基): 模板参数可以是整个派生类集合中的任何一个,这一事实与此无关,因为它可以是任何其他类型 在关


问题归结为:如果模板参数可以是一组派生类的任何一个,那么我应该写进普通模板基础类的虚线框中?

如在另一个答案中所说的,C++奇怪的模板模板(CRTP)的例子是:

模板
阶级基础
{
//基类中的方法可以使用模板访问派生类的成员
};
派生类:公共基
{
// ...
};
如果模板参数可以是整个派生类集合中的任何一个,那么我应该在公共模板基类的虚线框中写入什么

模板类的虚线框显示了模板参数(对于类基):

模板参数可以是整个派生类集合中的任何一个,这一事实与此无关,因为它可以是任何其他类型

在关系图中添加派生类以获得完整的CRTP:


从你的话中可以看出:


这并没有回答我的问题;没有提到模板参数必须是派生类的情况

在你的问题中,你只是说它可以,现在你想要它必须

注:CRTP由两个类定义,而不仅仅是基类。无论如何,如果你想有关于模板参数(T)的限制,只需使用一个约束,可能是T.parents->includes(Base),即使我不确定其中T的用法,它也必须应用于T的值,而不是T本身,它是一个类


从你的话到我的回答:


另一个想法是:是否允许从虚线框中的基类T向下绘制一个协作连接器,连接到从基类派生的每个描述的类

我看不出在这种情况下协作是如何出现的,您是否考虑到依赖关系

对我来说,你不能从虚线框中的T中画出关系,甚至有可能它也不能表示你想要什么

与其绘制从T到派生类的关系,不如在每次继承和绑定时绘制派生类,这在UML中是正确的方法


这并不能回答我的问题;没有提到模板参数必须是派生类的情况。我重新打开了它,因为答案是2012年的(当时不知道哪个U.M.L.-lol-版本已过时)。我的公式“可以”可以被公认地解释为不排除非派生类,但在CRTP的上下文中,我认为很明显,只有派生类才能被视为模板参数;对此我深表歉意。另一个想法是:是否允许从虚线框中的基类T向下绘制一个协作连接器到从基类派生的每个描述的类?@user2961818所以,是的,您可以,根据定义,没有约束,所有都是可能的,包括您是否拥有CRTP这一事实。我编辑了我的答案来回答你的第二个问题非常感谢你更新了图表;这正是我所希望的。!
template <class T>
class Base
{
    // methods within Base can use template to access members of Derived
};
class Derived : public Base<Derived>
{
    // ...
};