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
するより良い方法はありますか?B
現在、それは少し不器用に見えます。
目的は、bind
バインドに慣れていない可能性がある人々にどのように機能するかを伝え、おそらく bind が内部でどのように機能するかについて少し伝えることです。ダイアグラムはできるだけ単純にする必要があり、直観的で誤解を招かないハックは問題ありません。UML 標準に正確に準拠する必要はありません。
update :このバージョンbind
では、の内部関数ポインタの型が修正されています。