你有两种经典的可能性。
首先,使用两个全局函数重载,一个 for ComponentDc
,一个 for ComponentIc
:
void globalExec(ComponentDc) { std::cout << "Hello"; }
void globalExec(ComponentIc) { std::cout << "World"; }
void Device<Component>::exec() { globalExec(Component); }
其次,使用 traits-class:纯模板类,没有字段,具有不同的 typedef,只有静态函数作为方法。这个类对不同的可能参数类型有自己的特化。
template<Component> class DeviceTraits {};
template<> class DeviceTraits<ComponentDc> {
static std::string getMessage() { return "Hello"; }
};
template<> class DeviceTraits<ComponentIc> {
static std::string getMessage() { return "World"; }
};
void Device<Component>::exec() {
std::cout << DeviceTraits<Component>::getMessage();
}
使用特征类的好处是你不必用几个函数破坏你的全局命名空间。
关于Device
类本身的部分特化——这并不总是可能的,将任何模板参数特定的代码移动到特征类中被认为更方便。
这是 STL 中使用的经典方法。或者,您可以使用boost::enable_if
or std::enable_if
(对于最新的编译器)。