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