3

int8_t の参照を uint8_t の参照にキャストしようとしています。

私は次のコードを持っています:

inline mtype& operator&(mtype& mt, uint8_t& va) {
  // do something
  // ...

  return mt;
}

inline mtype& operator&(mtype& mt, int8_t& va) {
  // do the same but signed
  // ...

  return mt;
}

両方のオーバーロードが同じことをしているので、乾燥させたい(またはより良い drm) ため、最初の演算子を . で呼び出したいと思いcasted vaます。しかし、どうすればいいですか?これはうまくいきません。

inline mtype& operator&(mtype& mt, int8_t& va) {
  return mt& static_cast<uint8_t>(va); //  error: no match for 'operator&' in 'mt & (uint8_t)va'
}

どうすればいいですか?

4

4 に答える 4

6

データが何であるかを再解釈したい。

inline mtype& operator&(mtype& mt, int8_t& va) {
  return mt& reinterpret_cast<uint8_t&>(va);
}

ただし、注意してください。「署名付きで同じことを行う」の意味によっては、同じ関数を呼び出し、データが常にunsignedであると想定して正しいことを行っていない可能性があります。

コード一意の符号付き/符号なしロジックを持つ作業を行っている場合 (コードは同じように見えますが)、テンプレート関数を使用して正しいタイプ固有のロジックを生成する必要があります。

template< Typename T >
mtype& do_the_work( mtype& mt, T& va )
{
  // do something

  // (Here's an example of code that LOOKS the same, but doesn't DO the same)
  va = va >> 1;
}

inline mtype& operator&(mtype& mt, uint8_t& va) {
  return do_the_work( mt, va );
}

inline mtype& operator&(mtype& mt, int8_t& va) {
  return do_the_work( mt, va );
}
于 2013-04-18T21:46:18.240 に答える
1
inline mtype& operator&(mtype& mt, int8_t& va) {
  return mt & reinterpret_cast<uint8_t&>(va);
}
于 2013-04-18T21:46:07.537 に答える
1

キャストの結果が参照ではなく値になるため、エラーが発生します。

以下を使用する必要があります。

reinterpret_cast<uint8_t&>(va)
于 2013-04-18T21:46:26.447 に答える