リモートサーバーに接続するのが仕事のクラスがあるとします。このクラスを抽象化して、UDP 経由で接続するバージョンと TCP 経由で接続するバージョンの 2 つのバージョンを提供したいと考えています。可能な限り無駄のないランタイム コードを構築したいと考えており、ポリモーフィズムを使用する代わりに、テンプレートを検討しています。これが私が想定しているものですが、これが最善の方法であるかどうかはわかりません。
class udp {};
class tcp {};
template<class T,typename X>
class service
{
private:
// Make this private so this non specialized version can't be used
service();
};
template<typename X>
class service<udp, X>
{
private:
udp _udp;
X _x;
};
template<typename X>
class service<tcp, X>
{
private:
tcp _tcp;
X _x;
};
したがって、最終的な利点は、T の汎用性が引き続き利用できることですが、UDP または TCP 接続をセットアップするために必要な非常に異なるコードが特化されています。両方を 1 つのクラスに入れるか、IConnectionManager などのネットワーク接続を設定するための純粋な仮想インターフェイスに準拠する別のクラスを提供できると思います。
しかし、これにより、ジェネリック T のコードを両方の特殊化されたバージョンで記述して維持する必要があり、最終的には同じであるという問題が残ります。これに対処するにはどうすればよいですか?私はこれについてすべて間違っていると感じています。