2012-11-12 110 views
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; 
} 
+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

由于C++是S- tatically typed语言具有非常limited type introspection capabilities,使用模板是一个类型传递给类的最佳方式,并让一个类创建一个类型的新实例的唯一途径。另一种方法是通过typeid,但它不适用于您的示例,因为它不允许您定义新的实例。

+0

我看过typeid并得出了相同的结论。 –