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

use*_*703 3 c++ oop model class

我有以下类的层次结构:

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};
};
Run Code Online (Sandbox Code Playgroud)

ProcessChild()这里的两个功能是做无关的事情,而不是"寺庙"的方式add<T>可能.

我希望避免创建两个Anna类而只是这样做:

template<class T>
class Anna: public Parent<T>
    {
     void ProcessChild() 
     { 
        if(T is Boys)
         ProcessBoys();
        else
         ProcessGirls();
      };
    };
Run Code Online (Sandbox Code Playgroud)

没有在运行时执行dynamic_cast,有没有干净的方法来做到这一点?

谢谢.

Win*_*ute 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();
Run Code Online (Sandbox Code Playgroud)

源文件:

template<> void Anna<Boy>::ProcessChild() {
  // implementation for boys
}

template<> void Anna<Girl>::ProcessChild() {
  // implementation for girls
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

感谢@Deduplicator发现它.

  • @ user2164703:仅适用于那些专门的功能.通常只在头中声明显式特化并在实现文件中实现它通常是个好主意.否则,它们必须标记为"内联". (3认同)