【发布时间】:2017-01-01 12:02:15
【问题描述】:
我正在使用一个类库,其中所有类都直接或间接地从基类Base 派生并具有名称。该库提供了一种按名称搜索对象的工具,该名称将返回 Base*。
有没有什么方法可以找到返回对象的类型,而无需像下面的示例中那样使用dynamic_casts 检查所有可能性?如果可能的话,我想避免这种情况,因为派生类有模板参数,这有很多可能性。
如果我至少能够在不知道模板类型的情况下找出类类型(T1 或T2,在下面的示例中),那也很好。做类似dynamic_cast<T1<i_dont_care>*>的事情。
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base() {}
};
template <typename T> class T1 : public Base {};
template <typename T> class T2 : public Base {};
Base *find_by_name() {
return new T2<int>();
}
int main() {
Base *b = find_by_name();
if (T1<int> *p = dynamic_cast<T1<int>*>(b)) {
cout << "T1<int>" << endl;
// do something meaningful with p
} else if (T1<double> *p = dynamic_cast<T1<double>*>(b))
cout << "T1<double>" << endl;
else if (T2<int> *p = dynamic_cast<T2<int>*>(b))
cout << "T2<int>" << endl;
else if (T2<double> *p = dynamic_cast<T2<double>*>(b))
cout << "T2<double>" << endl;
else
cout << "unknown" << endl;
delete b;
return 0;
}
请注意,上面的示例是简化的,即。在每个if 中,我都会对p 做一些有意义的事情。
我确实从一开始就意识到这是一个糟糕的设计,但是我被这个库困住了,我也没有办法改变它的实现。
【问题讨论】:
-
如果需要此功能,那么
b应该有一个成员来执行此操作。您也可以尝试检查typeid(*b).name()。 -
你的
p都是多余的,写if ( dynamic_cast<T1<int>*>(b) ) -
Base真的没有其他成员了吗?这似乎是图书馆应该提供的那种功能。使用普通指针只能做这么多。 -
@M.M:我得考虑一下
typeid的想法,谢谢。关于多余的ps,看来我的例子有点过于简单了:)。 -
返回
Base*... 伙计,我以为我们已经解决了该死的赛昂人。