我已经在互联网上检查了一段时间,并没有找到我的问题的任何答案。
我想知道 C++ 是否支持有界多态性和/或 F 有界多态性。
例如,在 Java 中程序员可以这样做(有界多态性):
<T extends Car> void startEngine(T c) {/*body method*/}
和这个(F-Bounded多态性):
<T extends Comparable<T>> void compareWith(T c) {/*body method*/}
在 C++ 中有什么等价的吗?
谢谢!
最佳答案
<T extends Car> void startEngine(T c) {}
在 C++ 中,上面的等价物是这样的:
template<typename T, typename Unused= typename std::enable_if<std::is_base_of<Car,T>::value>::type>
void startEngine(T c) {}
好吧,语法很丑,但你可以用别名让它更好一点:
//first define a (reusuable) alias
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;
//then your code would look like this
template<typename T, typename Unused=extends<T,Car> >
void startEngine(T c)
{
}
或者您可以使用
static_assert
,正如另一个答案所解释的那样。但是 std::enable_if
和 static_assert
是 而不是 等价物。虽然 static_assert
为您提供了产生良好错误消息的机会,但 std::enable_if
可帮助您解决重载,这意味着仅当 Car
是 T
的基础时才会调用上述函数,否则将选择/考虑其他重载(如果有)。使用 static_assert
,这是不可能的:它只是失败并停止——它不会进一步寻找重载。同样地,
//then your code would look like this
template<typename T, typename Unused=extends<T,Comparable<T>> >
void compareWith(T c)
{
}
这种技术被称为:
希望有帮助。
关于c++ - C++ 中的模板 : (F-)bounded polymorphism,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19689069/