クラスの作成に使用されるファクトリ メソッド パターンがあり、実際の作成に進む前に入力パラメーターを検証したいと考えています。ここで扱っているのは A と B の 2 つのクラスで、それぞれに独自の検証があります。作成テンプレート関数で既にクラス タイプ (A または B) を渡しているので、そのタイプを直接使用して、どの検証を使用する必要があるかを伝えたいと思います。テンプレート関数の特殊化またはダミー入力パラメーターを使用してそれを行うことを検討していますが、それぞれに長所/短所があります。どちらかがより合理的に見えるか、または他のオプションもある場合はお知らせください。ありがとう!
ああ、私は検証を A または B の静的メソッドにすることを検討しましたが、レガシー コードを扱っており、そのようなものを移動するのはあまり簡単ではないため、見栄えがよくありませんでした。ただし、完全を期すために、これを以下のオプションとして示しました。
テンプレート機能の特化:
長所: 検証を選択するために、FactoryCreateClass メソッドに渡された型を直接使用できる
短所: 特殊化しかないため、テンプレート メソッドは活用されていません。
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = ValidateBlock<T>(int, double);
if (bSuccess)
T* = T::CreateInstance();
)
template <typename T>
bool ValidateBlock (int double); // don't need an implementation here since
// all specialization require different validation
template <>
bool ValidateBlock<A> (int, double)
{
//do validation before creating A
}
template <>
bool ValidateBlock<B> (int, double)
{
//do validation before creating B
}
ダミー変数:
長所: 検証を選択するために、FactoryCreateClass メソッドに渡された型を直接使用できる
短所:未使用のダミー変数
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = ValidateBlock(T /*dummy*/, int, double);
if (bSuccess)
T* = T::CreateInstance();
)
bool ValidateBlock (A/*dummy*/, int, double)
{
//do validation before creating A
}
bool ValidateBlock (B/*dummy*/, int, double)
{
//do validation before creating B
}
静的クラス メソッド:
長所: 検証を選択するために、FactoryCreateClass メソッドに渡された型を直接使用できる
短所: レガシー コードでこの種の変更を行うのは難しい
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = T::ValidateBlock(int, double);
if (bSuccess)
T* = T::CreateInstance();
)
static bool A::ValidateBlock (int, double)
{
//do validation before creating A
}
static bool B::ValidateBlock (int, double)
{
//do validation before creating B
}