0
class Foo
{
public:
    Foo(const void* data) : m_dataPtr(data) {}

template<typename T>
const T Get() {
    const T* readPoint = static_cast<const T*>(m_dataPtr);
    m_dataPtr = (const char *) m_dataPtr + sizeof(T);
    return *(readPoint);
}
private:   
    const void* m_dataPtr;
};

上記のクラスを取得したので、次のことができるようにオーバーロードを追加したいと思いoperator>>ます。

  Foo foo("Hello World");
  int8_t firstChar; // I want to get the first Char
  int16_t firstShort; // Get the 2 next bytes
  foo >> firstChar;
  foo >> firstShort; 

そこで、このオーバーロード関数を作成しました:

template<typename T>
void operator>>(Foo& lhs, T& rhs)
{
    rhs = lhs.Get<T>();
}

しかし、整数型が変換されintてから台無しになるため、それが機能するかどうかはわかりませんsizeof(T)

4

2 に答える 2

2

簡単な実験で、コードが意図したとおりに機能することがわかります。望ましくない「プロモーション」がどこでも行われているとは思いません。intテストで何かが昇進したとあなたが信じた理由は何ですか?

私が見る唯一の問題は

m_dataPtr += sizeof(T);

whereはポインタm_dataPtrとして宣言されています。const void *void ポインターは、ポインター演算をサポートしていません。あなたの意図を表現する適切な方法は

m_dataPtr = (const char *) m_dataPtr + sizeof(T);

C++ 言語では、組み込み演算子の特定のセットでのみ積分昇格が発生します。あなたのコードでは、それは問題ではないようです。でオーバーロードされた>>演算子を使用している場合foo >> firstChar、整数の昇格は行われず、テンプレート引数の演繹では、関連するすべてのオブジェクトの元の型が表示されます。

于 2014-08-06T18:23:02.113 に答える