1

我想使用 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);
}

这是我的第一次尝试。我认为还有一些改进的空间:

  1. 我应该捕获指向属性F和属性A中的指针bind还是分别表示它们?目前我正在展示两者。我认为该F::apply属性的语法也是错误的。

  2. bind班级编写签名模板的最佳方法是什么?

  3. 有没有更好的方法来使用decltypeinB的模板参数?目前它看起来有点笨拙。

目的是向bind可能不熟悉它的人传达其工作原理,并可能传达一些关于 bind 在内部如何工作的信息。该图应该尽可能简单,因此任何直观且不会误导的技巧都是可以的,它不必完全符合 UML 标准。

update此版本修复了bind的内部函数指针的类型。

4

0 回答 0