我已经检查了一段时间的内联网,并找到了我的问题的任何答案.我想知道C++是否支持有界多态性和/或F-有界多态性.
例如,在Java程序员中可以做到这一点(boundedn polymorphism):
<T extends Car> void startEngine(T c) {/*body method*/}
Run Code Online (Sandbox Code Playgroud)
这个(F-有界多态性):
<T extends Comparable<T>> void compareWith(T c) {/*body method*/}
Run Code Online (Sandbox Code Playgroud)
在C++中有什么相同的东西吗?
谢谢!
<T extends Car> void startEngine(T c) {}
Run Code Online (Sandbox Code Playgroud)
在C++中,与上面相同的是:
template<typename T, typename Unused= typename std::enable_if<std::is_base_of<Car,T>::value>::type>
void startEngine(T c) {}
Run Code Online (Sandbox Code Playgroud)
好吧,语法很难看,但你可以用别名使它更好一些:
//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)
{
}
Run Code Online (Sandbox Code Playgroud)
或者你可以使用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)
{
}
Run Code Online (Sandbox Code Playgroud)
这种技术被称为:
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |