C++ UML类图';s<&书信电报;绑定>&燃气轮机;vs std::bind()

C++ UML类图';s<&书信电报;绑定>&燃气轮机;vs std::bind(),c++,uml,class-diagram,std-function,stdbind,C++,Uml,Class Diagram,Std Function,Stdbind,到目前为止,我在两个特定的repo之间使用了一个接口类(带有继承),最近我使用std::function()和std::bind()替换了这个接口类 使用旧的、类似接口的方法,我最终得出以下结论: //a.hpp #include "b.hpp" class A{ public: A(InterfaceB* pb) : m_pb(pb) {}; void bar(){m_pb->foo();}; private: Interfac

到目前为止,我在两个特定的repo之间使用了一个接口类(带有继承),最近我使用std::function()和std::bind()替换了这个接口类

使用旧的、类似接口的方法,我最终得出以下结论:

//a.hpp
#include "b.hpp"

class A{    

  public:
    A(InterfaceB* pb) : m_pb(pb) {};        
    void bar(){m_pb->foo();};
  private:
    InterfaceB* m_pb;        

};
--

//b.hpp
#包括
类接口B{
公众:
虚拟void foo()=0;
};
B类:公共接口B{
公众:
void foo(){std::cout UML绑定
依赖关系指的是绑定:

TemplateBinding是TemplateableElement和 一种模板,用于指定实际数据的替换 参数的形式模板参数的ParameterableElements 模板

是一个特殊的实现依赖项,它表明类是模板的专门化,并设置模板子项

一个典型的例子是:

using void_function = std::function<void(void)> ; 
使用void_function=std::function;

C++绑定 C++中的P>将参数绑定到可动态调用的对象。<强>这是完全不同的语义。< /强>

如果您想在UML中显示这一点,则不会有太大帮助。您可以:

  • 显示bind返回的匿名类型是一个可调用的模板实例化,其中一个参数被B替换(与上面的图非常相似)

  • 如果有用,说明这个匿名类依赖于B

  • 如果有用,请显示从A到该匿名类的可选关系(0..1),并了解其他匿名类可能存在替代关系(如果您想在图表上说明几个,并明确它们是互斥的,可以使用OCL约束)

遗憾的是,无论你绘制什么,它都不会像你的C++设计那样通用和强大,而且它也没多大帮助。 建议: UML图的目标不是以图形方式编程,而是引导对内部的洞察。因此我强烈建议保持简单:

  • 唯一真正的关系是一个和回调的抽象可调用类之间的关系。这必须放在图表上

  • 您还可以显示此抽象回调可以依赖于关系图中的其他相关类。对这些依赖关系的注释可以简单地解释依赖关系表示与成员函数的绑定


我没有C++的线索。但是你的第一个图需要有一个实现关系,而不是一个泛化。而且这个关联应该是一个依赖关系。。谢谢,编辑了第一个图表。是的,第二个是我只是从某个地方添加的棘手的部分。我试图用它来展示函数包装器是如何设置的。不幸的是,我不知道语言构造。这可能不是巫术工作,但在不知道它做什么的情况下,我无法告诉它在UML中应该是什么样子。只是看了看它,然后re是UML中的一个模板绑定,在这种情况下应使用它。请参阅
//main.cpp
#include "a.hpp"
#include <memory>

int main(){

  InterfaceB* pb = new B;
  A a(pb);
  a.bar();
  delete pb;
}
//a_callback.hpp
#include <functional>

class A{    
  public:
    void setBcallback(std::function<void(void)> callback){m_callback = callback;};
    void bar(){m_callback();};
  private:
    std::function<void(void)> m_callback;

}
//b_callback.hpp
#include <iostream>

class B {

  public:
    void foo(){ std::cout << "hi"<< std::endl; };

}
//main.cpp
#include "a_callback.hpp"
#include <functional>

int main(){

  A a;
  B b;
  a.setBcallback(std::bind(&B::foo, &b));
  a.bar();
}
using void_function = std::function<void(void)> ;