Domanda

Sto ispezionare un pezzo di codice esistente e scoperto che comporta in modo diverso quando si compila con Visual C ++ 9 e MinGW:

inline LogMsg& LogMsg::operator<<(std::ostream& (*p_manip)(std::ostream&) )
{
    if ( p_manip == static_cast< std::ostream& (*)(std::ostream&) > ( &std::endl<char, std::char_traits<char> >) )
    {
        msg(m_output.str());
        m_output.str( "" );
    }
    else
    {
        (*p_manip) (m_output);            // or // output << p_manip;
    }
    return *this;
}

Come suggerisce il nome, si tratta di una classe di log e sovraccarica operator<<() mettere a nudo endls dal flusso.

ho scoperto perché si comporta in modo diverso:. Il p_manip == static_cast... test ha esito positivo con MinGW, mentre non riesce con Visual C ++ 9

  • MinGW "ignora" il cast e restituisce l'indirizzo reale del std::endl;
  • Visual C ++ 9 getta in realtà il puntatore a endl e restituisce un indirizzo diverso.

Ho cambiato il test per if ( p_manip == std::endl ) e ora si comporta come previsto.

La mia domanda è : qual è la logica dietro ad una complicata (e, come un dato di fatto, sbagliato) di test

?

Per motivi di completezza:

class LogStream
{
public:
    LogStream() {}
protected:
    std::ostringstream m_output;
};

class LogMsg : public LogStream
{
    friend LogMsg& msg() ;
    static LogMsg s_stream;
public:
    LogMsg() {}
    template <typename T>
        inline LogMsg& operator<<(T p_data);
    inline LogMsg& operator<<(std::ostream& (*p_manip)(std::ostream&) );
};
È stato utile?

Soluzione 2

Per informazioni:

Il if ( p_manip == std::endl ) dichiarazione non può essere compilato dal compilatore originale (GCC 3.4.5, il compilatore su cui è stato originariamente sviluppato il codice).

Ciò significa che il test non è stato sbagliato, come ho affermato nella mia interrogazione.

Altri suggerimenti

A occhio e croce, direi che l'autore originale non si rese conto che erano tipi compatibili, e ha fatto la conversione sulla spec (senza il compilatore costringendolo a).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top