【发布时间】:2012-03-22 13:59:59
【问题描述】:
我有以下层次结构:
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() {};
};
现在给定一个指向 base 的指针,我想知道是否 底层证券是派生1 或派生2。问题是 派生1和派生2都可以专门用于许多不同的 类型,使用 dynamic_cast 测试向下转换需要 要知道的模板类型。我最终得到了一些混乱、不可维护和不完整的代码:
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";
有没有更好的方法,可以处理任何类型的特化?
【问题讨论】:
-
一旦您知道类型是派生模板之一的特化,您打算做什么?
-
@James:为每个函数调用一个特定的函数 - 顺便说一句,还有更多的derived1和derived2
-
需要动态测试基类指针的具体类型的条件代码是一种不好的代码气味。可能有一种方法可以更改您的设计以避免这种情况。
-
@Emile:这到底有什么不好?
-
@XanderTulip:好的,这是一个问题。如果您要为某个函数提供
base,为什么它需要 调用仅在derived1类上的函数?该函数要么采用derived1,要么采用base。如果您发现自己不得不这样做,您需要重新评估您的类层次结构设计。简而言之,你让自己陷入了一个糟糕的设计境地,你需要找到一种方法来摆脱它。为了帮助您做到这一点,我们需要知道您的代码实际上想要完成什么。
标签: c++ inheritance metaprogramming dynamic-cast downcast