我总觉得涉及到模版特化及偏特化的时候,c++的定义就显得不够严谨了,或者所牵扯的内容就会太复杂了。
就如下面这段代码,在g++下能正常编译运行了,但是在目标产品的编译器上根本编不过。。。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class mystream
{
public:
mystream():m_pos(0)
{
m_vContainer.reserve(1<<10);
};
virtual ~mystream(){};
enum
{
BYTE_BIT_SIZE =8,
};
template <typename T > mystream& operator>>(T& a_iPara)
{
a_iPara = 0;
for(int i=0; i<sizeof(T);++i)
{
a_iPara = ((a_iPara<<BYTE_BIT_SIZE)+m_vContainer[m_pos+i]);
}
m_pos += sizeof(T);
return *this;
}
template <typename T > mystream& operator<<(const T& a_iPara)
{
//unsigned char bttmp[sizeof(T)]=0;
m_vContainer.insert(m_vContainer.end(),sizeof(T),0);
vector<unsigned char >::iterator it= m_vContainer.end()-1;
for(int i=0; i<sizeof(T);++i,--it)
{
*it = ((a_iPara>>(BYTE_BIT_SIZE*i))&0xff);
//printf("operator[%d]=%x\n",i , *it);
}
return *this;
}
template <typename T > mystream& operator>>(T* a_iPara)
{
//cout<<"CHARSTAR"<<endl;
if(NULL ==a_iPara)
{
return *this;
}
int i=0;
int size = m_vContainer.size();
int slen = 0;
for(i=0; (i+m_pos)<size;++i )
{
if(m_vContainer[m_pos+i]=='\0')
{
slen = i;
break;
}
}
if((i+m_pos)==size)
{
return *this;
}
for(i=0; i<slen;++m_pos,++i )
{
a_iPara[i] = m_vContainer[m_pos];
//cout<<m_vContainer[m_pos]<<endl;
}
a_iPara[i] = '\0';
++m_pos;
return *this;
}
template <typename T >
mystream& mystream::operator<< ( T* a_iPara)
{
if(NULL ==a_iPara)
{
m_vContainer.push_back(0);
return *this;
}
for(int i=0;a_iPara[i]!='\0';++i )
{
m_vContainer.push_back((unsigned char)a_iPara[i]);
}
cout<<"operator<< <T*>"<<endl;
m_vContainer.push_back(0);
return *this;
}
template <typename T >
mystream& mystream::operator<< (const T* a_iPara)
{
if(NULL ==a_iPara)
{
m_vContainer.push_back(0);
return *this;
}
for(int i=0;a_iPara[i]!='\0';++i )
{
m_vContainer.push_back((unsigned char)a_iPara[i]);
}
m_vContainer.push_back(0);
cout<<"operator<< <const T*>"<<endl;
return *this;
}
protected:
vector<unsigned char >m_vContainer;
int m_pos;
};
template <>
mystream& mystream::operator>> <string>(string& a_iPara)
{
a_iPara="";
int i=0;
int size = m_vContainer.size();
int slen = 0;
for(i=0; (i+m_pos)<size;++i )
{
if(m_vContainer[m_pos+i]=='\0')
{
slen = i;
break;
}
}
if((i+m_pos)==size)
{
return *this;
}
for(i=0; i<slen;++m_pos,++i )
{
a_iPara += m_vContainer[m_pos];
}
++m_pos;
cout<<"operator>> <string>"<<endl;
return *this;
}
template <>
mystream& mystream::operator<< <string>(const string& a_iPara)
{
cout<<"operator<< <string>"<<endl;
return (*this)<<a_iPara.c_str();
}
struct Test{};
mystream& operator<<(mystream&s,const Test&t)
{
cout<<"Test&t>"<<endl;
return s;
}
int main()
{
printf("hello world!\n");
char ptmp[]="hello!\n";
char*p = "world\n";
int i =1;
int j=2;
char ptmp1[20]="";
char ptmp2[20]="";
mystream s;
s<<i<<ptmp<<p;
s>>j>>ptmp1>>ptmp2;
cout<<j<<endl;
cout<<ptmp1<<endl;
cout<<ptmp2<<endl;
string str("this string\n");
s<<str;
string str2;
s>>str2;
cout<<str2;
Test to;
s<<to;
return 0;
}