#include <iostream>
#include<string>
struct Packet
{
//friend template declaration for primary template
template<typename DataType>
friend Packet& operator << (Packet& pkt, const DataType& data);
};
//implementation of primary template
template<typename DataType>
Packet& operator << (Packet& pkt, const DataType& data)
{
std::cout << "primary template called" << std::endl;
return pkt;
}
//implementation of explicit specialization
template<>
Packet& operator<<<std::string> (Packet& pkt, const std::string& data)
{
std::cout << "specialization for std::string called" << std::endl;
return pkt;
}
int main()
{
Packet p;
p << 100; //uses primary template
std::string s("someString");
p << s; //uses specialization for std::string
return 0;
}