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. のテンプレート パラメータを使用decltypeするより良い方法はありますか? B現在、それは少し不器用に見えます。

目的は、bindバインドに慣れていない可能性がある人々にどのように機能するかを伝え、おそらく bind が内部でどのように機能するかについて少し伝えることです。ダイアグラムはできるだけ単純にする必要があり、直観的で誤解を招かないハックは問題ありません。UML 標準に正確に準拠する必要はありません。

update :このバージョンbindでは、の内部関数ポインタの型が修正されています。

4

0 に答える 0