ткните носом
От: abrec Россия  
Дата: 02.10.09 11:26
Оценка:
Здравствуйте!

Может кто ткнет носом?

template< class TNumberHandler, typename T >
class CStreamNumberTypeImpl
{
protected:
    bool            m_bNeedSwap;
    T*        m_pValue;
    T        m_Value;
public:
    CStreamNumberTypeImpl()
        :m_bNeedSwap(true), m_pValue(NULL)
    {
    };

    void ToStream(std::ostream& s)
    {
        m_Value = *m_pValue;
        if(m_bNeedSwap)
        {
            TNumberHandler* pNumberHandler = static_cast< TNumberHandler* >(this);
            if(pNumberHandler) pNumberHandler->hton();
        }
        s.write(reinterpret_cast< char* >(&m_Value), sizeof(T));
    };
    void FromStream(std::istream& s)
    {
        s.read(reinterpret_cast< char* >(&m_Value), sizeof(T));
        if(m_bNeedSwap)
        {
            TNumberHandler* pNumberHandler = static_cast< TNumberHandler* >(this);
            if(pNumberHandler) pNumberHandler->ntoh();
        }
        *m_pValue = m_Value;
    };

    friend std::istream& operator >> (std::istream& s, CStreamNumberTypeImpl< TNumberHandler, T >& clLongTypeStream)
    {
        clLongTypeStream.FromStream(s);
        return s;
    };

    friend std::ostream& operator << (std::ostream& s, CStreamNumberTypeImpl< TNumberHandler, T >& clLongTypeStream)
    {
        clLongTypeStream.ToStream(s);
        return s;
    };
};

class CStreamSizeT :
    public CStreamNumberTypeImpl<CStreamSizeT, std::size_t>
{
public:
    CStreamSizeT(std::size_t* pValue, bool bNeedSwap = true)
    {
        m_pValue = pValue;
        m_bNeedSwap = bNeedSwap;
    };
    CStreamSizeT(const std::size_t* pValue, bool bNeedSwap = true)
    {
        m_pValue = const_cast< std::size_t* >(pValue);
        m_bNeedSwap = bNeedSwap;
    };
    void ntoh() { m_Value = static_cast< std::size_t >(ntohl(m_Value)); };
    void hton() { m_Value = static_cast< std::size_t >(htonl(m_Value)); };
};

//в коде

std::stringstream s;
std::size_t size(0);
....
s >> CStreamSizeT( &size, true ); //-->тут дает ошибку при компиляции под gcc в msvc все ок
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.