我需要将一个类型传递给一个类。下面的代码有效,但我想知道这是否是最好的方法。还有更好的方法吗?
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;
}
答案 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
,但它不适用于您的示例,因为它不允许您定义新实例。