#include <iostream>

using namespace std;

template <typename T>
void print(const T& t)
{
    cout << t << '\n';
}

int main()
{
    print(5);
    print(6.7);

    return 0;
}




#include <iostream>

using namespace std;

template <typename T>
void print(const T& t)
{
    cout << t << '\n';
}

void print(double d)
{
    cout << scientific << d << '\n';
}

int main()
{
    print(5);
    print(6.7);

    return 0;
}




#include <iostream>

using namespace std;

// Here's our primary template (must come first)
template <typename T>
void print(const T& t)
{
    cout << t << '\n';
}

// A full specialization of primary template print<T> for type double
// Full specializations are not implicitly inline, so make this inline if put in header file
template<>                          // template parameter declaration containing no template parameters
void print<double>(const double& d) // specialized for type double
{
    cout << scientific << d << '\n';
}

int main()
{
    print(5);
    print(6.7);

    return 0;
}