【发布时间】:2013-06-19 20:32:54
【问题描述】:
假设我有两个类:Serializable 和 Printable。
所以一个接受Printable 的所有派生类的简单模板函数可能如下所示:
template <class T, class B = Printable, class = typename std::enable_if<std::is_base_of<B, T>::value>::type>
void print(T value) {
cout << value << endl;
}
但是,如果我希望它也接受 Serializable 的所有派生类,而我仍然可以控制函数体,这显然行不通:
template <class T, class B = Printable, class = typename std::enable_if<std::is_base_of<B, T>::value>::type>
void print(T value) {
cout << value << endl;
}
template <class T, class B = Serializable, class = typename std::enable_if<std::is_base_of<B, T>::value>::type>
void print(T value) {
cout << value << endl;
}
// Error: Redefinition of ...
所以我认为这个问题的剩余解决方案是模板专业化。
但我就是想不通,如何将模板与std::is_base_of 和std::enable_if 结合使用。
希望有人愿意帮助我!
【问题讨论】:
-
因此,如果调用者没有为
B指定任何内容,您希望T派生自Printable还是派生自Serializable? -
看来您可以简单地使用两个非模板重载:
void print(const Printable& value);、void print(const Serializable& value);。 -
@KennyTM 我可以,但我需要它作为模板函数。
-
@Tim:为什么需要模板?
-
@AndyProwl 不,
class B = ...并不是可选的,我只是为了便于阅读而添加它。
标签: templates c++11 specialization