我想使用 UML 图表示以下代码:
#include <iostream>
#include <boost/bind.hpp>
using namespace std;
class A {
public:
void bar() {std::cout << "A::bar()" << std::endl;}
};
// FUNC should be callable with arguments (int, A*)
template <typename FUNC>
class B {
public:
B(FUNC func, int data) : func_(func), data_(data){}
void operator()(A* ap){func_(data_, ap);}
FUNC func_;
int data_;
};
// object generator uses argument deduction to construct B
template <typename FUNC>
B<FUNC> makeB(FUNC func, int data) {
return B<FUNC>(func, data);
}
struct F {
static void apply(int a, int b, A* ap){
std::cout << "a+b = " << a + b << std::endl;
ap->bar();
}
};
int main() {
A* a = new A;
auto b = makeB(boost::bind(F::apply, 10, _1, _2), 20);
b(a);
}
这是我的第一次尝试。我认为还有一些改进的空间:
我应该捕获指向属性
F
和属性A
中的指针bind
还是分别表示它们?目前我正在展示两者。我认为该F::apply
属性的语法也是错误的。为
bind
班级编写签名模板的最佳方法是什么?有没有更好的方法来使用
decltype
inB
的模板参数?目前它看起来有点笨拙。
目的是向bind
可能不熟悉它的人传达其工作原理,并可能传达一些关于 bind 在内部如何工作的信息。该图应该尽可能简单,因此任何直观且不会误导的技巧都是可以的,它不必完全符合 UML 标准。
update:此版本修复了bind
的内部函数指针的类型。