#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
#include <memory>
template <class T>
std::string GetTypeName()
{
//http://stackoverflow.com/questions/23266391/find-out-the-type-of-auto/23266701#23266701
std::unique_ptr<char, void(*)(void*)> name{abi::__cxa_demangle(typeid(T).name(), 0, 0, nullptr), std::free};
return name.get();
}
struct A
{
struct AA {};
struct AB {};
struct AC {};
struct BA {};
struct BB {};
struct BC {};
BA GetBTypeFromAType(AA a) { return BA(); }
BB GetBTypeFromAType(AB a) { return BB(); }
BC GetBTypeFromAType(AC a) { return BC(); }
template <typename AType>
void Func(AType a)
{
//using BType = typename std::result_of<decltype(GetBTypeFromAType(a))>::type;
std::cout << "Func called with " << GetTypeName<AType>() << " and got " << GetTypeName<decltype(GetBTypeFromAType(a))>() << std::endl;
}
};
int main()
{
A a;
A::AA aa;
A::AB ab;
A::AC ac;
a.Func(aa);
a.Func(ab);
a.Func(ac);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxjeHhhYmkuaD4KI2luY2x1ZGUgPG1lbW9yeT4KCnRlbXBsYXRlIDxjbGFzcyBUPgpzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpCnsKICAvL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjMyNjYzOTEvZmluZC1vdXQtdGhlLXR5cGUtb2YtYXV0by8yMzI2NjcwMSMyMzI2NjcwMQogIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCB2b2lkKCopKHZvaWQqKT4gbmFtZXthYmk6Ol9fY3hhX2RlbWFuZ2xlKHR5cGVpZChUKS5uYW1lKCksIDAsIDAsIG51bGxwdHIpLCBzdGQ6OmZyZWV9OwogIHJldHVybiBuYW1lLmdldCgpOwp9CgoKc3RydWN0IEEKewogIHN0cnVjdCBBQSB7fTsKICBzdHJ1Y3QgQUIge307CiAgc3RydWN0IEFDIHt9OwoKICBzdHJ1Y3QgQkEge307CiAgc3RydWN0IEJCIHt9OwogIHN0cnVjdCBCQyB7fTsKCiAgQkEgR2V0QlR5cGVGcm9tQVR5cGUoQUEgYSkgeyByZXR1cm4gQkEoKTsgfQogIEJCIEdldEJUeXBlRnJvbUFUeXBlKEFCIGEpIHsgcmV0dXJuIEJCKCk7IH0KICBCQyBHZXRCVHlwZUZyb21BVHlwZShBQyBhKSB7IHJldHVybiBCQygpOyB9CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBBVHlwZT4KICB2b2lkIEZ1bmMoQVR5cGUgYSkKICB7CiAgICAvL3VzaW5nIEJUeXBlID0gdHlwZW5hbWUgc3RkOjpyZXN1bHRfb2Y8ZGVjbHR5cGUoR2V0QlR5cGVGcm9tQVR5cGUoYSkpPjo6dHlwZTsKICAgIHN0ZDo6Y291dCA8PCAiRnVuYyBjYWxsZWQgd2l0aCAiIDw8IEdldFR5cGVOYW1lPEFUeXBlPigpIDw8ICIgYW5kIGdvdCAiIDw8IEdldFR5cGVOYW1lPGRlY2x0eXBlKEdldEJUeXBlRnJvbUFUeXBlKGEpKT4oKSA8PCBzdGQ6OmVuZGw7CiAgfQp9OwoKaW50IG1haW4oKQp7CiAgQSBhOwogIEE6OkFBIGFhOwogIEE6OkFCIGFiOwogIEE6OkFDIGFjOwogIGEuRnVuYyhhYSk7CiAgYS5GdW5jKGFiKTsKICBhLkZ1bmMoYWMpOwogIHJldHVybiAwOwp9