#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
namespace
{
class placeholder {};
placeholder _1;
}
class Test
{
public:
Test() {}
Test(const Test& p) {}
~Test() {}
void do_stuff(const std::vector<int>& v)
{
std::vector<int>::const_iterator it = v.begin();
for (; it != v.end(); ++it) {
std::cout << *it << std::endl;
}
}
};
class simple_bind_t
{
typedef void(Test::*fn)(const std::vector<int>&);
fn fn_;
Test t_;
public:
simple_bind_t(fn f, const Test& t): fn_(f), t_(t)
{
int i = 0;
}
~simple_bind_t()
{
int i = 0;
}
void operator()(const std::vector<int>& a)
{
return (t_.*fn_)(a);
}
};
simple_bind_t simple_bind(void(Test::*fn)(const std::vector<int>&),
const Test& t, const placeholder&)
{
return simple_bind_t(fn, t);
}
int main()
{
Test t;
//boost::shared_ptr<Test> ptr_test = boost::make_shared<Test>();
std::vector<int> vec;
vec.push_back(42);
simple_bind(&Test::do_stuff, t, _1)(vec); //等同于下面2行代码逻辑
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+Cm5hbWVzcGFjZQp7CmNsYXNzIHBsYWNlaG9sZGVyIHt9OwpwbGFjZWhvbGRlciBfMTsKfQoKY2xhc3MgVGVzdAp7CnB1YmxpYzoKICBUZXN0KCkge30KICBUZXN0KGNvbnN0IFRlc3QmIHApIHt9CiAgflRlc3QoKSB7fQogIHZvaWQgZG9fc3R1ZmYoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgdikKICB7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHYuYmVnaW4oKTsKICAgIGZvciAoOyBpdCAhPSB2LmVuZCgpOyArK2l0KSB7CiAgICAgIHN0ZDo6Y291dCA8PCAqaXQgPDwgc3RkOjplbmRsOwogICAgfQogIH0KfTsKCmNsYXNzIHNpbXBsZV9iaW5kX3QKewogIHR5cGVkZWYgdm9pZChUZXN0OjoqZm4pKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mKTsKICBmbiBmbl87CiAgVGVzdCB0XzsKcHVibGljOgogIHNpbXBsZV9iaW5kX3QoZm4gZiwgY29uc3QgVGVzdCYgdCk6IGZuXyhmKSwgdF8odCkKICB7CiAgICBpbnQgaSA9IDA7CiAgfQogIH5zaW1wbGVfYmluZF90KCkKICB7CiAgICBpbnQgaSA9IDA7CiAgfQoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYSkKICB7CiAgICByZXR1cm4gKHRfLipmbl8pKGEpOwogIH0KfTsKCnNpbXBsZV9iaW5kX3Qgc2ltcGxlX2JpbmQodm9pZChUZXN0OjoqZm4pKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0JiB0LCBjb25zdCBwbGFjZWhvbGRlciYpCnsKICByZXR1cm4gc2ltcGxlX2JpbmRfdChmbiwgdCk7Cn0KCmludCBtYWluKCkKewogIFRlc3QgdDsKICAvL2Jvb3N0OjpzaGFyZWRfcHRyPFRlc3Q+IHB0cl90ZXN0ID0gYm9vc3Q6Om1ha2Vfc2hhcmVkPFRlc3Q+KCk7CiAgc3RkOjp2ZWN0b3I8aW50PiB2ZWM7CiAgdmVjLnB1c2hfYmFjayg0Mik7CiAgc2ltcGxlX2JpbmQoJlRlc3Q6OmRvX3N0dWZmLCB0LCBfMSkodmVjKTsgLy/nrYnlkIzkuo7kuIvpnaIy6KGM5Luj56CB6YC76L6RCiAgcmV0dXJuIDA7Cn0=