我已经在网上查了一段时间了,已经找到了我的问题的答案。我想知道C++是否支持有界多态性和/或F-界多态性.
例如,在Java中,程序员可以这样做(奖品多态):
<T extends Car> void startEngine(T c) {/*body method*/}而这个(F-界多态性):
<T extends Comparable<T>> void compareWith(T c) {/*body method*/}在C++中有什么等价的东西吗?
谢谢!
发布于 2013-10-30 17:02:12
<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)
{
}这种技术被称为:
希望这能有所帮助。
发布于 2013-10-30 17:03:57
在C++11中,您可以使用static_assert和类型特性来检查模板参数是否是从特定类派生的类。例如:
#include <type_traits>
class Base {};
class Derived : Base {};
class Other {};
template<class T>
void foo(T t)
{
static_assert(std::is_base_of<Base, T>::value, "T must be a class derived from Base");
}
int main()
{
foo(Derived()); // ok
foo(Base()); // ok
foo(Other()); // error: static assertion failed: T must be a class derived from Base
}https://stackoverflow.com/questions/19689069
复制相似问题