#include <iostream>
#include <string>
using namespace std;
struct T{
int a;
void b(){}
int c(int)
{
return 1;
}
};
template<typename CT, CT> struct member_helper;
template<typename FT, FT(T::*mem)>
struct member_helper<FT(T::*), mem> {
static string worker()
{
return "for members";
}
};
template<typename Return, typename... Args, Return(T::*fun)(Args...)>
struct member_helper<Return(T::*)(Args...), fun> {
static string worker()
{
return "for member functions returning non void";
}
};
template<typename... Args, void(T::*fun)(Args...)>
struct member_helper<void(T::*)(Args...), fun> {
static string worker()
{
return "for member functions returning void";
}
};
int main() {
cout << member_helper<decltype(&T::a), &T::a>::worker() << endl; //prints for members, ok
cout << member_helper<decltype(&T::b), &T::b>::worker() << endl; //cannot distinguish between all of the three
cout << member_helper<decltype(&T::c), &T::c>::worker() << endl; //cannot distinguish between member function returning non void and member
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFR7CiAgICBpbnQgYTsKICAgIHZvaWQgYigpe30KICAgIGludCBjKGludCkKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIENULCBDVD4gc3RydWN0IG1lbWJlcl9oZWxwZXI7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBGVCwgRlQoVDo6Km1lbSk+CnN0cnVjdCBtZW1iZXJfaGVscGVyPEZUKFQ6OiopLCBtZW0+IHsKICAgIHN0YXRpYyBzdHJpbmcgd29ya2VyKCkKICAgIHsKICAgICAgICByZXR1cm4gImZvciBtZW1iZXJzIjsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFJldHVybiwgdHlwZW5hbWUuLi4gQXJncywgUmV0dXJuKFQ6OipmdW4pKEFyZ3MuLi4pPgpzdHJ1Y3QgbWVtYmVyX2hlbHBlcjxSZXR1cm4oVDo6KikoQXJncy4uLiksIGZ1bj4gewogICAgc3RhdGljIHN0cmluZyB3b3JrZXIoKQogICAgewogICAgICAgIHJldHVybiAiZm9yIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIG5vbiB2b2lkIjsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3MsIHZvaWQoVDo6KmZ1bikoQXJncy4uLik+CnN0cnVjdCBtZW1iZXJfaGVscGVyPHZvaWQoVDo6KikoQXJncy4uLiksIGZ1bj4gewogICAgc3RhdGljIHN0cmluZyB3b3JrZXIoKQogICAgewogICAgICAgIHJldHVybiAiZm9yIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQiOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBjb3V0IDw8IG1lbWJlcl9oZWxwZXI8ZGVjbHR5cGUoJlQ6OmEpLCAmVDo6YT46OndvcmtlcigpIDw8IGVuZGw7ICAgIC8vcHJpbnRzIGZvciBtZW1iZXJzLCBvawogICAgY291dCA8PCBtZW1iZXJfaGVscGVyPGRlY2x0eXBlKCZUOjpiKSwgJlQ6OmI+Ojp3b3JrZXIoKSA8PCBlbmRsOyAgICAvL2Nhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFsbCBvZiB0aGUgdGhyZWUKICAgIGNvdXQgPDwgbWVtYmVyX2hlbHBlcjxkZWNsdHlwZSgmVDo6YyksICZUOjpjPjo6d29ya2VyKCkgPDwgZW5kbDsgICAgLy9jYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZW1iZXIgZnVuY3Rpb24gcmV0dXJuaW5nIG5vbiB2b2lkIGFuZCBtZW1iZXIKfQo=