如何将类型传递给类

时间:2012-11-12 15:02:54

标签: c++ templates types

我需要将一个类型传递给一个类。下面的代码有效,但我想知道这是否是最好的方法。还有更好的方法吗?

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;
}

2 个答案:

答案 0 :(得分: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 */ }

答案 1 :(得分:1)

由于C ++是一种非常tatically typed的s limited type introspection capabilities语言,因此使用模板是将类型传递给类的最佳方法,也是让类创建类型的新实例的唯一方法。另一种方法是传递typeid,但它不适用于您的示例,因为它不允许您定义新实例。