2

タイプをクラスに渡す必要があります。以下のコードは機能しますが、これを行うための最良の方法かどうか疑問に思いました。より良い方法はありますか?

template<typename T, typename M>
class BinaryParser
{
public:
   BinaryParser(T& decoder, unsigned header_size) 
      :  m_decoder(decoder), m_header_size(header_size) {}

   virtual bool Parse() {
      M message;
      //do something with message
      return true;
   }

protected:
   T&                  m_decoder;
   unsigned            m_header_size;  
}; 

int main(int argc, char* argv[])
{
   int a1, b1;
   a1=1;
   b1=2;
   BinaryParser<int,string> bp(a1,b1);
   bp.Parse();
   return 0;
}
4

2 に答える 2

2

Parseサブクラスでメンバー関数を再実装しない場合は、メンバー関数を仮想化する必要はありません(サンプルコードからわかるように)。代わりに、テンプレートメソッドを提供できます。テンプレートパラメータタイプにインターフェイスを定義する必要があるかもしれません。

template <typename M>
bool Parse() {
    M message; // M must be default constructable
    // ... parse message from a stream or something
    m_decoder.decode( message.getBytes()); // M must have getBytes() member
    return message.isValid(); // M must have isValid() member
}

次に、次のように使用します。

BinaryParser<int> bp(a1,b1);

if ( bp.Parse<string>()) { /* parsed */ }
if ( bp.Parse<some_other_type>()) { /* parsed */ }
于 2012-11-12T15:17:27.127 に答える
1

C ++は、型のイントロスペクション機能が非常に限られたデータ型の言語であるため、テンプレートを使用することが、型をクラスに渡すための最良の方法であり、クラスに型の新しいインスタンスを作成させる唯一の方法です。別の方法は、を渡すことですが、新しいインスタンスを定義できないため、この例では機能しません。typeid

于 2012-11-12T15:08:52.623 に答える