如何根据 C++ 中的模板类型调用函数?
How to call a function depending on template type in C++?
我有以下 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};
};
这里的两个 ProcessChild()
函数正在做不相关的事情,而不是 add<T>
那样的 "templetable"。
我希望避免创建两个 Anna class,而是这样做:
template<class T>
class Anna: public Parent<T>
{
void ProcessChild()
{
if(T is Boys)
ProcessBoys();
else
ProcessGirls();
};
};
有没有在运行时不执行 dynamic_cast 的简洁方法?
谢谢。
您可以特化单个成员函数而无需指定整个 class。在这种情况下:
Header:
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
}
如果你想保留 header-only:
,可以通过声明 inline
在 header 中拥有专门的成员函数
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 发现了这一点。
我有以下 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};
};
这里的两个 ProcessChild()
函数正在做不相关的事情,而不是 add<T>
那样的 "templetable"。
我希望避免创建两个 Anna class,而是这样做:
template<class T>
class Anna: public Parent<T>
{
void ProcessChild()
{
if(T is Boys)
ProcessBoys();
else
ProcessGirls();
};
};
有没有在运行时不执行 dynamic_cast 的简洁方法?
谢谢。
您可以特化单个成员函数而无需指定整个 class。在这种情况下:
Header:
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
}
如果你想保留 header-only:
,可以通过声明inline
在 header 中拥有专门的成员函数
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 发现了这一点。