2011-08-11 9 views
5

次回、まだ作品のようなコード:テンプレート変換

typedef int_t<int, unsigned> int64; 
typedef uint_t<unsigned>  uint64; 

int64 a = 1000; 
uint64 b = a; 

uint64 x = 512; 
int64 y = x; 

今残された唯一の問題は、他のに対して、より高いまたはより低い精度のint_tタイプから変換することですので、私はそうするコメントコンストラクタを宣言したが、私は何をするのか分かりませんそれに書き込みますか?

typedef int_t<int, unsigned> int64; 
typedef uint_t<unsigned>  uint64; 

typedef int_t<int64, uint64> int128; 
typedef uint_t<uint64>  uint128; 

int64 a = 1024; 
int128 b = a; 

int128 x = 100; 
int64 y = x; 

答えて

1

私はリトルとビッグエンディアンのための答えを考え出し:

template<typename ty_a, typename ty_b> 
int_t(const int_t<ty_a, ty_b>& value) 
{ 
    *this = value < 0? -1: 0; 

#ifdef BIG_ENDIAN 
     if (sizeof(*this) < sizeof(value)) 
      *this = *((int_t*)&value.lo + (sizeof(value.lo)/sizeof(*this) - 1)); 
     else 
      *((int_t<ty_a, ty_b>*)&hi + sizeof(*this)/sizeof(value) - 1) = value; 
#else 
     if (sizeof(*this) < sizeof(value)) 
      *this = *(int_t*)&value; 
     else 
      *(int_t<ty_a, ty_b>*)&lo = value; 
#endif 
} 

は答えを覚えてexcatly私が欲しいものint_t

1

あなたは彼らが何をしたいのかを定義する必要があります。ここでは

は、私はそのコンストラクタの結果をテストするために使用される例です。符号なしの場合、サイズを増やすのは簡単です。上位ビットを0に設定し、オペランドから下位ビットをコピーするだけです。署名の場合、オペランドを符号拡張することができます。

縮小するには、何をしたいかを決める必要があります。値が合わない場合はスローしたいですか?ほとんどの場合、すべての上位ビットを破棄して、使用可能な領域に格納するだけです。

+0

のthatsのために定義されるようにoperator==operator<を必要ですが、どうやって? exmapleがいいでしょう。 –

関連する問題