<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)
{
}
这种技术被称为:
希望有帮助。