class base
{
public:
virtual ~base(){}
virtual void foo() {}
};
template <typename T>
class derived1 : public base
{
virtual void foo() {};
};
template <typename T>
class derived2 : public base
{
virtual void foo() {};
};
今ベースへのポインタを与え、私は基礎となる がderived1かderived2のどちらかであるかどうかを確認したいと思います。問題は、 derived1とderived2の両方が多くの異なる タイプで特殊化できることです.Downcastをテストするためにdynamic_castを使用すると、 テンプレートタイプを知る必要があります。私はコードの、乱雑unmaintableと不完全ビットになってしまっている:
base* b = new derived1<int>();
if (dynamic_cast<derived1<int>*> ||
dynamic_cast<derived1<unsigned int>*> ||
dynamic_cast<derived1<double>*>)
std::cout << "is derived1";
else if (dynamic_cast<derived2<int>*> ||
dynamic_cast<derived2<unsigned int>*> ||
dynamic_cast<derived2<double>*>)
std::cout << "is derived2";
は、任意のタイプの特殊化を扱うことができる良い方法は、ありますか?
タイプが派生テンプレートの1つの特殊化であることがわかったらどうしますか? –
@James:各関数に特定の関数を呼び出す - btwにはderived1とderived2以上がある –
基本クラスポインタの具体的な型を動的にテストする必要のある条件付きコードは、悪いコードの匂いです。おそらく、これを避けるためにデザインを変更する方法があります。 –