質問

バックグラウンド:

テンプレートストリームオペレーターがあります(例: operator << (ostream &, std::vector <T>))(8ビットの整数タイプである可能性のある出力コンテナ要素(例: unsigned char, int_least8_t, 、et cetera)。

問題:

デフォルトは、これらのタイプがASとして出力されることです char (ASCII)。私はしか使用しませんでした char (また wchar_t または何でも)ASCII変数の場合、署名/署名されていないタイプはありません。これらの他の8ビットタイプを常に出力するにはどうすればよいですか signed int / unsigned int (数字)代わりに、発信者がタイプを知らない場合でも?

最初に試みる:

たとえば定義するなど、(GCCで)試しました operator << (ostream &, unsigned char) キャストが入っています(すなわち stream << static_cast <int> (value). 。それは機能します unsigned char 値がありますが、その後 uint8_t aのように出力されます char.

同じ基礎となるタイプ(すなわち unsigned/signed char 過負荷で使用できないので、たとえば過負荷を定義することはできません operator << (ostream &, int_fast8_t).

役に立ちましたか?

解決

頭に浮かぶ1つの方法は、タイプ特性を使用して各タイプの出力タイプを定義することです。すべてのタイプについて手作業でそれを宣言する必要があります。特性は、データタイプ自体とは異なる出力タイプを持つすべてのデータタイプに特化したテンプレート構造として定義できます。

template< T >
struct output_trait {
    typedef const T & output_type;
}

あなたのオペレーターであなたは書いています:

std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;

これはデフォルトではキャストされませんが、その種類の場合は output_trait 専門化されていますそれはキャストを行います:

template<>
struct output_trait< unsigned char > {
    typedef unsigned int output_type;
}

他のヒント

実際のデータを変数に混乱させ、印刷するために選択した表現が何であれ、あなたは混乱しています。

このように考えてください: chars, ints, doubles, longs, 、何でも、それらはすべてあなたが数字を保存するための記憶の塊です。チャーは0〜255(または-128と127)の数です - あなたはそれをASCII文字として、またはAとして表現することを選択できます数、またはOpenGLの助けを借りて空の星として。

キャラクター「A」の背後にある番号を表示したい場合は、プログラムにそのメモリの塊(「A」が含まれている)を数字として扱うように指示してください。キャストを使用します。ここ:

http://www.cplusplus.com/doc/tutorial/typecasting/

それが役立つかどうか見てください!

あなたは単にそれをキャストすることができます:

#include<iostream>

int main()
{
 uint8_t blah = 65;
 std::cout << static_cast<int>(blah) << "\n";
 return 0;
}

65

私があなたを正しく理解しているなら..このように出力します:

std::cout << ( unsigned int )char << '\n';

またはそれ以上のC ++スタイル - たとえば、static_castを使用してください。

int main()
{
    char a = 'a';
    char b = 97;
    std::cout << static_cast< unsigned int >( a ) << '\n';
    std::cout << static_cast< unsigned int >( b ) << '\n';
    return 0;
}

両方とも std::cout 同じものを印刷します:最初のもの - のASCIIコード 'a': 97, 、2番目のもの - 値だけ 97, 、bに保存されています。両方、 ab, 、まったく同じです。

出力する前にキャストできます。

std::cout << (unsigned int) container[index];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top