我已经在互联网上检查了一段时间,并没有找到我的问题的任何答案。
我想知道 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_ifstatic_assert 而不是 等价物。虽然 static_assert 为您提供了产生良好错误消息的机会,但 std::enable_if 可帮助您解决重载,这意味着仅当 CarT 的基础时才会调用上述函数,否则将选择/考虑其他重载(如果有)。使用 static_assert ,这是不可能的:它只是失败并停止——它不会进一步寻找重载。

同样地,
//then your code would look like this
template<typename T, typename Unused=extends<T,Comparable<T>> >
void compareWith(T c)
{
}

这种技术被称为:
  • SFINAE

  • 希望有帮助。

    关于c++ - C++ 中的模板 : (F-)bounded polymorphism,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19689069/

    10-10 04:57