#include <iostream>
int add(int a, int b){ return a + b; }
int add_f(float a, float b){ return a + b; }
union {
int (*f1)(int, int);
int (*f2)(float, float);
} fp;
int main(void)
{
fp.f1 = &add;
std::cout << "Expected (1): " << add(1, 3) << std::endl;
std::cout << "Actual (1): " << (fp.f1)(1, 3) << std::endl;
std::cout << "Expected (2): " << add(1.0f, 3.0f) << std::endl;
std::cout << "Actual (2): " << (fp.f2)(1.0f, 3.0f) << std::endl;
fp.f2 = &add_f;
std::cout << "Expected (3): " << add_f(1.0f, 3.0f) << std::endl;
std::cout << "Actual (3): " << (fp.f2)(1.0f, 3.0f) << std::endl;
std::cout << "Expected (4): " << add_f(1, 3) << std::endl;
std::cout << "Actual (4): " << (fp.f1)(1, 3) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IGFkZChpbnQgYSwgaW50IGIpeyByZXR1cm4gYSArIGI7IH0KaW50IGFkZF9mKGZsb2F0IGEsIGZsb2F0IGIpeyByZXR1cm4gYSArIGI7IH0KCnVuaW9uIHsKICAgIGludCAoKmYxKShpbnQsIGludCk7CiAgICBpbnQgKCpmMikoZmxvYXQsIGZsb2F0KTsKfSBmcDsKCmludCBtYWluKHZvaWQpCnsKICAgIGZwLmYxID0gJmFkZDsKICAgIHN0ZDo6Y291dCA8PCAiRXhwZWN0ZWQgKDEpOiAiIDw8IGFkZCgxLCAzKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIkFjdHVhbCAgICgxKTogIiA8PCAoZnAuZjEpKDEsIDMpIDw8IHN0ZDo6ZW5kbDsKCiAgICBzdGQ6OmNvdXQgPDwgIkV4cGVjdGVkICgyKTogIiA8PCBhZGQoMS4wZiwgMy4wZikgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJBY3R1YWwgICAoMik6ICIgPDwgKGZwLmYyKSgxLjBmLCAzLjBmKSA8PCBzdGQ6OmVuZGw7CgogICAgZnAuZjIgPSAmYWRkX2Y7CiAgICBzdGQ6OmNvdXQgPDwgIkV4cGVjdGVkICgzKTogIiA8PCBhZGRfZigxLjBmLCAzLjBmKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIkFjdHVhbCAgICgzKTogIiA8PCAoZnAuZjIpKDEuMGYsIDMuMGYpIDw8IHN0ZDo6ZW5kbDsKCiAgICBzdGQ6OmNvdXQgPDwgIkV4cGVjdGVkICg0KTogIiA8PCBhZGRfZigxLCAzKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIkFjdHVhbCAgICg0KTogIiA8PCAoZnAuZjEpKDEsIDMpIDw8IHN0ZDo6ZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==