#include <functional>
#include <type_traits>
#include <iostream> //just form cout for demonstration
class base {
int number = 42;
public:
void a_method(void) {
std::cout << number << std::endl;
}
};
class derived : public base {
};
class another_class{
public:
void a_method(void) {
std::cout << 41;
}
};
template <class class_type,class function_type>
void bind_base_method(function_type function, base& instance) {
static_assert(std::is_base_of<base,class_type>::value || std::is_same<base,class_type>::value, "class_type is not derived of base or base");
static_assert(std::is_member_function_pointer<function_type>::value, "Function is not a member function");
//call like
auto this_will_call_the_method = std::bind(function, instance);
this_will_call_the_method();
}
int main(void)
{
derived foo;
bind_base_method<derived>(&derived::a_method, foo);
another_class bar;
//bind_base_method(&another_class::a_method, bar);//error won't work as wanted
return 0;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPGlvc3RyZWFtPiAvL2p1c3QgZm9ybSBjb3V0IGZvciBkZW1vbnN0cmF0aW9uCgpjbGFzcyBiYXNlIHsKCWludCBudW1iZXIgPSA0MjsKcHVibGljOgoJdm9pZCBhX21ldGhvZCh2b2lkKSB7CgkJc3RkOjpjb3V0IDw8IG51bWJlciA8PCBzdGQ6OmVuZGw7Cgl9Cn07CgpjbGFzcyBkZXJpdmVkIDogcHVibGljIGJhc2UgewoKfTsKCmNsYXNzIGFub3RoZXJfY2xhc3N7CnB1YmxpYzoKCXZvaWQgYV9tZXRob2Qodm9pZCkgewoJCXN0ZDo6Y291dCA8PCA0MTsKCX0KfTsKCnRlbXBsYXRlIDxjbGFzcyBjbGFzc190eXBlLGNsYXNzIGZ1bmN0aW9uX3R5cGU+CnZvaWQgYmluZF9iYXNlX21ldGhvZChmdW5jdGlvbl90eXBlIGZ1bmN0aW9uLCBiYXNlJiBpbnN0YW5jZSkgewoJc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8YmFzZSxjbGFzc190eXBlPjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPGJhc2UsY2xhc3NfdHlwZT46OnZhbHVlLCAiY2xhc3NfdHlwZSBpcyBub3QgZGVyaXZlZCBvZiBiYXNlIG9yIGJhc2UiKTsKCXN0YXRpY19hc3NlcnQoc3RkOjppc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxmdW5jdGlvbl90eXBlPjo6dmFsdWUsICJGdW5jdGlvbiBpcyBub3QgYSBtZW1iZXIgZnVuY3Rpb24iKTsKCgkvL2NhbGwgbGlrZQoJYXV0byB0aGlzX3dpbGxfY2FsbF90aGVfbWV0aG9kID0gc3RkOjpiaW5kKGZ1bmN0aW9uLCBpbnN0YW5jZSk7CgoJdGhpc193aWxsX2NhbGxfdGhlX21ldGhvZCgpOwp9CgppbnQgbWFpbih2b2lkKQp7CglkZXJpdmVkIGZvbzsKCWJpbmRfYmFzZV9tZXRob2Q8ZGVyaXZlZD4oJmRlcml2ZWQ6OmFfbWV0aG9kLCBmb28pOwoKCWFub3RoZXJfY2xhc3MgYmFyOwoJLy9iaW5kX2Jhc2VfbWV0aG9kKCZhbm90aGVyX2NsYXNzOjphX21ldGhvZCwgYmFyKTsvL2Vycm9yIHdvbid0IHdvcmsgYXMgd2FudGVkCgoJcmV0dXJuIDA7Cn0KCg==