#include <iostream>

void foo(double me) {
    std::cout << "I am floating cockerel " << me << std::endl;
}

void foo(int me) {
    std::cout << "Je suis integer " << me << std::endl;
}

void foo(const char * me) {
    std::cout << "Soy string " << me << std::endl;
}

template<int what> auto kukareku();

template<> auto kukareku<0>() {return 42;}
template<> auto kukareku<1>() {return 3.14;}
template<> auto kukareku<2>() {return "stroka";}

int main() {
    foo(kukareku<0>());
    foo(kukareku<1>());
    foo(kukareku<2>());

    foo(42);
    foo(3.14);
    foo("stroka");

    return 0;
}