#include <iostream>
#include <utility>
#include <type_traits>
struct A {
int x;
void a() {
std::cout << "an a! " << x << "\n";
}
};
struct B {
double x;
double b(double k) {
std::cout << "b! " << x << ", " << k << "\n";
return x - k;
}
void b() {
std::cout << "b! " << x << ", ?\n";
}
};
struct C {
A *_first__;
B *_second__;
C(A * _first__, B * _second__):_first__(_first__), _second__(_second__) {
} template < typename K, typename ... T > static auto _a_caller__(K * k, T && ... args)->decltype(k->a(std::forward < T > (args) ...)) {
return k->a(std::forward < T > (args)...);
}
template < typename...T > auto a(T &&...args)->decltype(_a_caller__(_first__, std::forward < T > (args)...)) {
return _a_caller__(_first__, std::forward < T > (args)...);
}
template < typename...T > auto a(T &&...args)->decltype(_a_caller__(_second__, std::forward < T > (args)...)) {
return _a_caller__(_second__, std::forward < T > (args)...);
}
template < typename K, typename...T > static auto _b_caller__(K * k, T && ... args)->decltype(k->b(std::forward < T > (args) ...)) {
return k->b(std::forward < T > (args)...);
}
template < typename...T > auto b(T &&...args)->decltype(_b_caller__(_first__, std::forward < T > (args)...)) {
return _b_caller__(_first__, std::forward < T > (args)...);
}
template < typename...T > auto b(T &&...args)->decltype(_b_caller__(_second__, std::forward < T > (args)...)) {
return _b_caller__(_second__, std::forward < T > (args)...);
}
};
int main() {
A a {12};
B b {24};
C c (&a, &b);
c.a();
c.b();
std::cout << c.b(2445) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogCnN0cnVjdCBBIHsKICAgIGludCB4OwogCiAgICB2b2lkIGEoKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJhbiBhISAiIDw8IHggPDwgIlxuIjsKICAgIH0KfTsKIApzdHJ1Y3QgQiB7CiAgICBkb3VibGUgeDsKIAogICAgZG91YmxlIGIoZG91YmxlIGspIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImIhICIgPDwgeCA8PCAiLCAiIDw8IGsgPDwgIlxuIjsKICAgICAgICByZXR1cm4geCAtIGs7CiAgICB9CiAKICAgIHZvaWQgYigpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImIhICIgPDwgeCA8PCAiLCA/XG4iOwogICAgfQp9OwogCnN0cnVjdCBDIHsKICAgIEEgKl9maXJzdF9fOwogICAgQiAqX3NlY29uZF9fOwogICAgIEMoQSAqIF9maXJzdF9fLCBCICogX3NlY29uZF9fKTpfZmlyc3RfXyhfZmlyc3RfXyksIF9zZWNvbmRfXyhfc2Vjb25kX18pIHsKICAgIH0gdGVtcGxhdGUgPCB0eXBlbmFtZSBLLCB0eXBlbmFtZSAuLi4gVCA+IHN0YXRpYyBhdXRvIF9hX2NhbGxlcl9fKEsgKiBrLCBUICYmIC4uLiBhcmdzKS0+ZGVjbHR5cGUoay0+YShzdGQ6OmZvcndhcmQgPCBUID4gKGFyZ3MpIC4uLikpIHsKICAgIHJldHVybiBrLT5hKHN0ZDo6Zm9yd2FyZCA8IFQgPiAoYXJncykuLi4pOwogICAgfQogICAgdGVtcGxhdGUgPCB0eXBlbmFtZS4uLlQgPiBhdXRvIGEoVCAmJi4uLmFyZ3MpLT5kZWNsdHlwZShfYV9jYWxsZXJfXyhfZmlyc3RfXywgc3RkOjpmb3J3YXJkIDwgVCA+IChhcmdzKS4uLikpIHsKICAgICAgICByZXR1cm4gX2FfY2FsbGVyX18oX2ZpcnN0X18sIHN0ZDo6Zm9yd2FyZCA8IFQgPiAoYXJncykuLi4pOwogICAgfQogICAgdGVtcGxhdGUgPCB0eXBlbmFtZS4uLlQgPiBhdXRvIGEoVCAmJi4uLmFyZ3MpLT5kZWNsdHlwZShfYV9jYWxsZXJfXyhfc2Vjb25kX18sIHN0ZDo6Zm9yd2FyZCA8IFQgPiAoYXJncykuLi4pKSB7CiAgICAgICAgcmV0dXJuIF9hX2NhbGxlcl9fKF9zZWNvbmRfXywgc3RkOjpmb3J3YXJkIDwgVCA+IChhcmdzKS4uLik7CiAgICB9CiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIEssIHR5cGVuYW1lLi4uVCA+IHN0YXRpYyBhdXRvIF9iX2NhbGxlcl9fKEsgKiBrLCBUICYmIC4uLiBhcmdzKS0+ZGVjbHR5cGUoay0+YihzdGQ6OmZvcndhcmQgPCBUID4gKGFyZ3MpIC4uLikpIHsKICAgICAgICByZXR1cm4gay0+YihzdGQ6OmZvcndhcmQgPCBUID4gKGFyZ3MpLi4uKTsKICAgIH0KICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUuLi5UID4gYXV0byBiKFQgJiYuLi5hcmdzKS0+ZGVjbHR5cGUoX2JfY2FsbGVyX18oX2ZpcnN0X18sIHN0ZDo6Zm9yd2FyZCA8IFQgPiAoYXJncykuLi4pKSB7CiAgICAgICAgcmV0dXJuIF9iX2NhbGxlcl9fKF9maXJzdF9fLCBzdGQ6OmZvcndhcmQgPCBUID4gKGFyZ3MpLi4uKTsKICAgIH0KICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUuLi5UID4gYXV0byBiKFQgJiYuLi5hcmdzKS0+ZGVjbHR5cGUoX2JfY2FsbGVyX18oX3NlY29uZF9fLCBzdGQ6OmZvcndhcmQgPCBUID4gKGFyZ3MpLi4uKSkgewogICAgICAgIHJldHVybiBfYl9jYWxsZXJfXyhfc2Vjb25kX18sIHN0ZDo6Zm9yd2FyZCA8IFQgPiAoYXJncykuLi4pOwogICAgfQp9OwogCmludCBtYWluKCkgewogICAgQSBhIHsxMn07CiAgICBCIGIgezI0fTsKIAogICAgQyBjICgmYSwgJmIpOwogCiAgICBjLmEoKTsKICAgIGMuYigpOwogICAgc3RkOjpjb3V0IDw8IGMuYigyNDQ1KSA8PCBzdGQ6OmVuZGw7Cn0=
prog.cpp: In instantiation of 'decltype (decltype (k->.a((forward<T>)(C::_a_caller__::args)...)) C::_a_caller__(((C*)0)->C::_first__, (forward<T>)(C::a::args)...)) C::a(T&& ...) [with T = {}, decltype (C::_a_caller__(((C*)0)->C::_first__, (forward<T>)(C::a::args)...)) = void]':
prog.cpp:56:9: instantiated from here
prog.cpp:33:36: sorry, unimplemented: mangling overload
prog.cpp: In instantiation of 'decltype (decltype (k->.b((forward<T>)(C::_b_caller__::args)...)) C::_b_caller__(((C*)0)->C::_second__, (forward<T>)(C::b::args)...)) C::b(T&& ...) [with T = {}, decltype (C::_b_caller__(((C*)0)->C::_second__, (forward<T>)(C::b::args)...)) = void]':
prog.cpp:57:9: instantiated from here
prog.cpp:45:36: sorry, unimplemented: mangling overload
prog.cpp: In instantiation of 'decltype (decltype (k->.b((forward<T>)(C::_b_caller__::args)...)) C::_b_caller__(((C*)0)->C::_second__, (forward<T>)(C::b::args)...)) C::b(T&& ...) [with T = {int}, decltype (C::_b_caller__(((C*)0)->C::_second__, (forward<T>)(C::b::args)...)) = double]':
prog.cpp:58:26: instantiated from here
prog.cpp:45:36: sorry, unimplemented: mangling overload