我想使用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);
}
这是我的first attempt。我认为还有一些改进空间:
我应该捕获F
属性中A
和bind
的指针还是代表他们?目前我正在展示两者。我认为F::apply
属性的语法也是错误的。
为bind
课程编写签名模板的最佳方法是什么?
在decltype
的模板参数中使用B
是否有更好的方法?目前它看起来有点笨拙。
目的是向可能不熟悉它的人传达bind
的工作方式,并传达一些关于bind如何在内部工作的内容。该图应该尽可能简单,因此任何直观且没有误导性的黑客都可以,它不必完全符合UML标准。
更新:This version修复了bind
内部函数指针的类型。