可能运行良好的一个选项如下:让每个解析器类定义具有相同签名的方法,但这样做完全独立于其他类。然后,引入一个实现所有这些相同函数的二级类层次结构,然后将每个方法调用转发给一个具体的解析器对象。这样,解析器的实现获得了内联的所有好处,因为从类的角度来看,所有调用都可以静态解析,而客户端可以获得多态性的好处,因为任何方法调用都会动态地解析为正确的类型。
执行此操作的问题是您使用额外的内存(包装器对象占用空间),并且当您调用解析器函数时,您可能还会至少涉及一个额外的间接,因为调用会进行
客户端 包装器 实现
根据您从客户端调用方法的频率,此实现可能会很好地工作。
使用模板,可以实现包装层 非常 简洁。这个想法如下。假设您有方法fA,fB和fC。首先定义一个这样的基类:
class WrapperBase { public: virtual ~WrapperBase() = 0; virtual void fA() = 0; virtual void fB() = 0; virtual void fC() = 0; };
现在,将以下模板类型定义为子类:
template <typename Implementation> class WrapperDerived: public WrapperBase { private: Implementation impl; public: virtual void fA() { impl.fA(); } virtual void fB() { impl.fB(); } virtual void fC() { impl.fC(); } };
现在,您可以执行以下操作:
WrapperBase* wrapper = new WrapperDerived<MyFirstImplementation>(); wrapper->fA(); delete wrapper; wrapper = new WrapperDerived<MySecondImplementation>(); wrapper->fB(); delete wrapper;
换句话说,编译器只需实例化即可为您生成所有包装器代码 WrapperDerived 模板。
WrapperDerived
希望这可以帮助!