C++中的模板:(F-)有界多态性
Templates in C++: (F-)bounded polymorphism
我已经在intrnet上检查了一段时间,并且没有找到我的问题的任何答案。我想知道C++是否支持有界多态性和/或 F 有界多态性。
例如,在Java中,程序员可以这样做(有界多态性):
<T extends Car> void startEngine(T c) {/*body method*/}
和这个(F有界多态性):
<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++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
}
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?