2012-11-12 108 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並得出了相同的結論。 –