0

私はよく次のようなことをします:

uint8_t c=some_value;
std::cout << std::setfill('0') << std::setw(2);
std::cout << std::hex << int(c);
std::cout << std::setfill(' ');

(特に、デバッグ情報のダンプ中)。次のようなストリームに入れることができる操作的なものがあればいいと思いませんか。

std::cout << "c 値: 0x" << hexb(c) << '\n';

それはそのすべてを行うでしょうか?誰もそれを行う方法を知っていますか?

私はこれを機能させましたが、もっと簡単な方法が欲しいです:

#include <iostream>
#include <iomanip>
class hexcdumper{
public:
    hexcdumper(uint8_t c):c(c){};
    std::ostream&
    operator( )(std::ostream& os) const
    {
        // set fill and width and save the previous versions to be restored later
        char fill=os.fill('0');
        std::streamsize ss=os.width(2);

        // save the format flags so we can restore them after setting std::hex
        std::ios::fmtflags ff=os.flags();

        // output the character with hex formatting
        os  << std::hex << int(c);

        // now restore the fill, width and flags
        os.fill(fill);
        os.width(ss);
        os.flags(ff);
        return os;
    }
private:
    uint8_t c;
};

hexcdumper
hexb(uint8_t c)
{
    // dump a hex byte with width 2 and a fill character of '0'
    return(hexcdumper(c));
}

std::ostream& operator<<(std::ostream& os, const hexcdumper& hcd)
{    
   return(hcd(os)); 
}

私がこれを行うとき:

std::cout << "0x" << hexb(14) << '\n';
  1. hexb(c) が呼び出され、コンストラクターが c を保存する hexcdumper を返します。
  2. hexcdumper のオーバーロードされた operator<< は、ストリームを渡す hexcdumper::operator() を呼び出します
  3. hexcdumper の operator() がすべての魔法をやってくれます
  4. hexcdumper::operator() が戻った後、オーバーロードされた operator<< は hexcdumper::operator() から返されたストリームを返すため、連鎖が機能します。

出力には、次のように表示されます。

0x0e

これを行う簡単な方法はありますか?

パトリック

4

1 に答える 1

0

これは、ストリーム パイプで直接行うことができます。

std::cout << "Hex = 0x" << hex << 14 << ", decimal = #" << dec << 14 << endl;

出力:

Hex = 0xe, decimal = #14
于 2013-07-17T02:16:13.113 に答える