引数をバインドしないが、C++ クラスでメンバー関数を呼び出す方法を提供する、boost::bind の非常に単純なエディションを実装する方法。
これが私の最初の試みです:
#include <iostream>
struct Foo {
void x(int i) { std::cout << "Foo " << i << std::endl; }
};
struct Bar {
void y(int i) { std::cout << "Bar " << i << std::endl; }
};
template<typename A1, typename I, typename M>
struct Binder {
Binder(I i, M m) : i_(i), m_(m) { }
void operator()(A1 a1) {
(i_->*m_)(a1);
}
I i_;
M m_;
};
template<typename A1, typename I, typename M>
Binder<A1, I, M> my_bind(I i, M m) {
return Binder<A1, I, M>(i, m);
}
int main(int argc, const char *argv[])
{
Foo foo;
Bar bar;
Binder<int, Foo*, void (Foo::*)(int)> b1 = my_bind<int>(&foo, &Foo::x);
Binder<int, Bar*, void (Bar::*)(int)> b2 = my_bind<int>(&bar, &Bar::y);
b1(1);
b2(2);
return 0;
}
上記の実装は機能し、次のように出力されます。
Foo 1
Bar 2
問題は、my_bind の 2 つの呼び出しが異なるタイプのオブジェクトを返すことです。my_bind が A1 のみに依存する型を返すように、プログラムを変更するにはどうすればよいですか。