std::hex rückgängig machen ohne extra stringstream



  • Folgendes Minimalbeispiel:

    #include <sstream>
    #include <cassert>
    
    struct data {
      std::uint64_t hexdata;
      int counter;
    };
    std::ostream &operator<<(std::ostream &os, const data &d) {
      std::ostringstream ss;          // Sehr unelegant
      ss << std::hex << d.hexdata;    // und langsam
      return os << ss.str() << ' ' << d.counter;
    }
    
    int main() {
      data d{ 0xDEAD, 11 };
      {
        std::ostringstream ss;
        ss << d;
        assert(ss.str() == "dead 11");
      }
      {
        std::ostringstream ss;
        ss << std::oct << d;
        assert(ss.str() == "dead 13");
      }
    }
    

    Ich würde gerne den unnötigen ostringstream in Zeile 9 und 10 loswerden. Das Problem ist dass "counter" so formatiert werden soll wie angegeben, hexdata hingegen immer hexadezimal.

    Hat jemand eine Idee wie ich das machen kann?



  • Warum steht das std::hex nicht direkt im Ausgabestream?



  • #include <cstdint>
    #include <cassert>
    #include <sstream>
    
    struct data
    {
    	std::uint64_t hexdata;
    	int counter;
    };
    
    std::ostream & operator<<( std::ostream & os, data const & d )
    {
      auto old_flags( os.flags() );
      os << std::hex << d.hexdata << ' ';
      os.flags( old_flags );
      return os << d.counter;
    }
    
    int main()
    {
    	data d{ 0x0dead, 11 };
    	{
    		std::ostringstream ss;
    		ss << d;
    		assert(ss.str() == "dead 11");
    	}
    	{
    		std::ostringstream ss;
    		ss << std::oct << d;
    		assert(ss.str() == "dead 13");
    	}
    }
    

Anmelden zum Antworten