我可以想到四种方法。
首先,std::ostream
作为你的GeneralOutStream
,并假设每个人都继承它。也许写一些东西,以QTextStream
使其成为std::ostream
.
其次,编写一个template
接受GeneralOutStream&& out
并对其进行操作的方法。这需要在您的标头中公开您的实现。我会推荐这个。非常强烈,但这确实意味着virtual
最终变得毫无用处。
第三,编写一个类型擦除,使用构造函数GeneralOutStream
在类中公开要与之交互的通用输出流的部分,该template
构造函数将传入的泛型类型存储在pImpl
withvirtual
方法中,然后在对象的实现中使用该类型。这具有运行时开销并且编写起来非常棘手,并且类似于std::function
- 除了GeneralOutStream
必须处理能够编写整个无数类型的模式!
如果我要编写#3,GeneralOutStream
将是一个template
需要GeneralOutStream
处理的类型序列,然后进行一些元编程以将这些重载准确地暴露给<<
. 这变得非常棘手,因为您需要手动复制重载决议。
第四,创建您想要支持的“GeneralOutStream”类型的枚举。使用双分派技术通过virtual
方法调用传递对这些类型实例的引用,在另一端解绑它们并调用您的实现template
方法,要求实现类处理整个枚举。这个实现比#3 稍微简单一些,限制了可以传递给draw
方法的类型,但允许完全访问实现中的类型class
。