#include <functional>
struct C {
int F(int, char) { return 0; }
};
template<typename S>
struct delete_class;
template<typename R, typename C, typename... Ts>
struct delete_class<R (C::*)(Ts...)>
{
typedef R(type)(Ts...);
};
int main()
{
static_assert(
std::is_same<delete_class<decltype(&C::F)>::type,
int(int, char)
>::value, "!");
using namespace std::placeholders;
std::function<delete_class<decltype(&C::F)>::type> f;
C c;
f = std::bind(&C::F, &c, _1, _2);
}
ICAgICNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKICAgIHN0cnVjdCBDIHsKICAgICAgICBpbnQgRihpbnQsIGNoYXIpIHsgcmV0dXJuIDA7IH0KICAgIH07CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KICAgIHN0cnVjdCBkZWxldGVfY2xhc3M7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQywgdHlwZW5hbWUuLi4gVHM+CiAgICBzdHJ1Y3QgZGVsZXRlX2NsYXNzPFIgKEM6OiopKFRzLi4uKT4KICAgIHsKICAgICAgICB0eXBlZGVmIFIodHlwZSkoVHMuLi4pOwogICAgfTsKCiAgICBpbnQgbWFpbigpCiAgICB7CiAgICAgICAgc3RhdGljX2Fzc2VydCgKICAgICAgICAgICAgc3RkOjppc19zYW1lPGRlbGV0ZV9jbGFzczxkZWNsdHlwZSgmQzo6Rik+Ojp0eXBlLAogICAgICAgICAgICBpbnQoaW50LCBjaGFyKQogICAgICAgICAgICA+Ojp2YWx1ZSwgIiEiKTsKCiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOwoKICAgICAgICBzdGQ6OmZ1bmN0aW9uPGRlbGV0ZV9jbGFzczxkZWNsdHlwZSgmQzo6Rik+Ojp0eXBlPiBmOwogICAgICAgIEMgYzsKICAgICAgICBmID0gc3RkOjpiaW5kKCZDOjpGLCAmYywgXzEsIF8yKTsKICAgIH0K