#include <iostream>
struct Plot{
void add(double x, double y){
std::cout << x << ' ' << y << '\n';
}
};
template <class UI_class, class... Args>
auto wrapper(void (UI_class::*function)(Args...)) {
return [function](UI_class &lui, Args &&... args) {
#if 0
[&lui, function, args = std::forward<Args>(args)... ]() mutable {
(lui.*function)(std::move(args)...);
}();
#else
(lui.*function)(std::forward<Args>(args)...);
#endif
};
}
int main() {
Plot p;
auto function = wrapper(&Plot::add);
function(p, 1, 2);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFBsb3R7Cgl2b2lkIGFkZChkb3VibGUgeCwgZG91YmxlIHkpewoJCXN0ZDo6Y291dCA8PCB4IDw8ICcgJyA8PCB5IDw8ICdcbic7Cgl9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVUlfY2xhc3MsIGNsYXNzLi4uIEFyZ3M+CmF1dG8gd3JhcHBlcih2b2lkIChVSV9jbGFzczo6KmZ1bmN0aW9uKShBcmdzLi4uKSkgewoJcmV0dXJuIFtmdW5jdGlvbl0oVUlfY2xhc3MgJmx1aSwgQXJncyAmJi4uLiBhcmdzKSB7CiNpZiAwCgkJWyZsdWksIGZ1bmN0aW9uLCBhcmdzID0gc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uIF0oKSBtdXRhYmxlIHsKCQkJKGx1aS4qZnVuY3Rpb24pKHN0ZDo6bW92ZShhcmdzKS4uLik7CgkJfSgpOwojZWxzZQoJCShsdWkuKmZ1bmN0aW9uKShzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwojZW5kaWYKCX07Cn0KCmludCBtYWluKCkgewoJUGxvdCBwOwoJYXV0byBmdW5jdGlvbiA9IHdyYXBwZXIoJlBsb3Q6OmFkZCk7CglmdW5jdGlvbihwLCAxLCAyKTsKfQ==