我有以下类的层次结构:
class Boy : Child
class Girl : Child
template<class T>
class Parent
{
vector<T> children;
}
class AnnaBoys: public Parent<Boy>
{
void ProcessChild() { do things specific to Anna boys };
};
class AnnaGirls: public Parent<Girl>
{
void ProcessChild() { do things specific to Anna girls};
};
这里的两个ProcessChild()
函数正在执行无关的事情,而不是add<T>
可能存在的“templetable”。
我希望避免创建两个Anna类而只是这样做:
template<class T>
class Anna: public Parent<T>
{
void ProcessChild()
{
if(T is Boys)
ProcessBoys();
else
ProcessGirls();
};
};
如果没有在运行时执行dynamic_cast,有没有干净的方法呢?
感谢。
答案 0 :(得分:10)
您可以专门化各个成员函数,而无需指定整个类。在这种情况下:
部首:
template<typename T>
class Anna : Parent<T> {
public:
void ProcessChild() {
// default implementation (if desired)
}
};
template<> void Anna<Boy>::ProcessChild();
template<> void Anna<Girl>::ProcessChild();
源文件:
template<> void Anna<Boy>::ProcessChild() {
// implementation for boys
}
template<> void Anna<Girl>::ProcessChild() {
// implementation for girls
}
如果你想保留标题,可以在标题中声明专门的成员函数inline
:
template<typename T>
class Anna : Parent<T> {
public:
void ProcessChild() {
// default implementation (if desired)
}
};
template<> inline void Anna<Boy>::ProcessChild() {
// implementation for boys
}
template<> inline void Anna<Girl>::ProcessChild() {
// implementation for girls
}
感谢@Deduplicator发现它。