#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;
}