如何根据C ++中的模板类型调用函数?

时间:2015-02-17 19:01:46

标签: c++ class oop model

我有以下类的层次结构:

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,有没有干净的方法呢?

感谢。

1 个答案:

答案 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发现它。