如何在C++中实现MyClass<T扩展OtherClass>?
How to implement MyClass<T extends OtherClass> in C++?
有人能告诉我如何在C++中实现这个Java代码吗?
public class MyClass<T extends OtherClass>{
....
}
我已经在C++中对此进行了测试:
template<class T, class OtherClass>
class MyClass
{
public:
MyClass();
}
但是我得到错误:invalid use of template-name 'MyClass' without an argument list
问候
您可以将std::is_base_of
与static_assert
结合使用:
template<class T>
class MyClass
{
static_assert( std::is_base_of< OtherClass, T >::value, "T does not extend OtherClass");
public:
MyClass();
};
(当然,您也可以将OtherClass
作为额外的模板参数,以防您需要更灵活(
如果你声明了一个模板化类(即你对template<class T, class OtherClass>
所做的(,那么你必须使用你声明的模板。由于您在MyClass
中没有使用T
或OtherClass
,因此会出现编译器错误。
至于如何在C++中实现T extends OtherClass
,它没有那么简单,因为C++具有多重继承,但你可以在stl
中使用is_base_of
函数
一般来说,在C++中,你只会使用:
template<class T>
class MyClass
你不需要说extends OtherClass
.
解释如下:
在 C++ 和 Java 中,当您访问对象的方法或字段时,编译器必须确保对象表达式的静态类型支持该方法或字段,否则将无法编译。
在 Java 中,泛型类和方法只编译一次。当编译泛型类或方法时,不知道哪些类型参数(如T
(是或可能是什么。因此,边界是必要的,以使编译器允许访问 Object
未提供的方法和字段。绑定T extends OtherClass
的原因是,在MyClass
的某个地方,它试图访问由OtherClass
提供的T
类型的表达式上的方法或字段。因此,此绑定允许编译器进行类型检查并成功编译。
相比之下,在C++中,模板化类和方法为每个不同的类型参数(称为模板的每个"实例化"(编译一次,就好像编译器复制并粘贴模板代码的副本,并替换代码中每次出现的T
的实际类型参数。因此,在编译模板化类或方法时,确切地知道T
是什么类型。像在 Java 中一样,边界的规范是不必要的,因为编译器可以直接检查T
的类型是否支持给定的方法或字段。如果T
是OtherClass
的子类型,它将成功编译。如果T
不是OtherClass
的子类型,则很可能它不会具有该名称的方法或字段,即使有,也可能没有正确的类型,因此可能无法编译。它基本上是鸭子打字。
但有可能,您有一个不同的、不相关的类型,它不是 OtherClass
的子类型,它还具有与 OtherClass
MyClass
中使用的方法和字段中的方法和字段相同的名称和类型,如果您尝试使用该类型参数化MyClass
,编译器不会抱怨它。但是,无论如何,存在这样的类型可能是糟糕的设计,并且您不太可能意外地在错误的地方使用这种类型。
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- 嵌套参数包扩展失败
- C4204:使用的非标准扩展:非常量聚合初始值设定项
- 如何在C++中实现MyClass<T扩展OtherClass>?
- C++版本的<?扩展了OtherClass>