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 回答