2

リファクタリングしようとしているテンプレート コードがいくつかあります。具体的には、パラメトリック ディメンションによってテンプレート化されたジオメトリック タイプ (曲線、サーフェス、ボリューム、ハイパーボリュームなどを表すことができます) とポイント タイプです。

問題は、このような一般的な方法で編集するのが非常に扱いにくくなっていることです。ほとんどの場合、パラメトリック ディメンション 1、2、および 3 しか使用しません。最近変更されているのは、部分的な特殊化だけです。コードは非常に安定しており、完全です。

コードの編集の難しさは別として、任意の次元のグリッドに一般化する方法で内部データを保存する必要があることに起因するパフォーマンスの問題もいくつかあります.一般的な方法でパフォーマンスの問題を軽減することは可能ですが、それは、多くの不必要な複雑さを追加し続けるだけです。基本的に問題は、テンプレートが一般化されすぎていることです。

そこで、一般的なテンプレート コードを、ディメンションごとに 1 つずつ、3 つの個別のテンプレートに置き換えます。また、ポイント型のテンプレートを維持したいので、単純なクラスだけを使用したくありません。

マクロと #include ファイルを使用して C の方法でテンプレートを複数回作成した場合、プリプロセッサを介して入力を実行し、必要な 3 つの異なるバージョンを取得できます。

手動で行うこともできますが、少なくとも出発点としては、自動化されたソリューションを好みます。

特定の入力でテンプレートのソースを取得するために、C++ に存在する同様の方法またはリファクタリング ソリューションはありますか?


もう少し具体的に言うと、次のようなコードがあります。

template< int Dimension, class PointType > class Nurbs { ... }
template< class PointType > class NurbsCurve : public Nurbs< 1, PointType > { ... }
template< class PointType > class NurbsSurface : public Nurbs< 2, PointType > { ... }
template< class PointType > class NurbsVolume : public Nurbs< 3, PointType > { ... }

しかし、私は次のようなコードで終わりたいです:

template< class PointType > class NurbsCurve { ... }
template< class PointType > class NurbsSurface { ... }
template< class PointType > class NurbsVolume { ... }
4

2 に答える 2

0

それがあなたの質問に答えているかどうかわからない:

継承を削除してメンバーを使用することもできます。代わりに、次のようにします。

template<class PointType> class NurbsCurve   : public Nurbs<1, PointType> { ... };
template<class PointType> class NurbsSurface : public Nurbs<2, PointType> { ... };
template<class PointType> class NurbsVolume  : public Nurbs<3, PointType> { ... };

次のようなものを使用します。

template<class PointType> class NurbsCurve   { ... private: Nurbs<1, PointType> data; };
template<class PointType> class NurbsSurface { ... private: Nurbs<2, PointType> data; };
template<class PointType> class NurbsVolume  { ... private: Nurbs<3, PointType> data; };

注: - 各クラスで Nurbs のプロトタイプをコピーする必要がある場合があります。- 後で必要に応じて、Nurbs を特定の実装に置き換えることができます。

于 2013-09-26T11:20:11.443 に答える