4つのアプローチが考えられます。
まず、std::ostream
あなたGeneralOutStream
の を取り、誰もがそれを継承すると仮定します。QTextStream
たぶん、それを にする方法で aをラップするものを書きstd::ostream
ます。
次に、それを受け取って操作するtemplate
メソッドを作成GeneralOutStream&& out
します。これには、ヘッダーで実装を公開する必要があります。これをお勧めします。かなり強いですが、それは結局virtual
かなり役に立たないことを意味します.
3 番目に、 withメソッドで渡されたジェネリック型を格納GeneralOutStream
するコンストラクターを使用して、クラス内でやり取りする一般的な出力ストリームの部分を公開する型消去を記述し、オブジェクトの実装内でその型を使用します。これにはランタイム オーバーヘッドがあり、記述するのは非常に難しく、無数の型全体を記述できるように処理する必要がある以外は --のパターンに似ています。template
pImpl
virtual
std::function
GeneralOutStream
#3を書くとしたら、GeneralOutStream
が処理するはずtemplate
の一連の型を取り、GeneralOutStream
メタプログラミングを行ってそれらのオーバーロードを正確に に公開し<<
ます。オーバーロードの解決を手動で複製する必要があるため、これは非常に厄介です。
次に、サポートする「GeneralOutStream」タイプの列挙を作成します。二重ディスパッチ手法を使用して、virtual
メソッド呼び出しを介してこれらの型のインスタンスへの参照を渡し、反対側でそれらを分離し、実装メソッドを呼び出しますtemplate
。実装クラスが列挙全体を処理する必要があります。これは #3 よりも実装がやや簡単で、draw
メソッドに渡すことができる型を制限しますが、実装内の型への完全なアクセスを許可しますclass
。