如何在C++中实现MyClass<T扩展OtherClass>?

How to implement MyClass<T extends OtherClass> in C++?

本文关键字:扩展 OtherClass gt lt C++ 实现 MyClass      更新时间:2023-10-16

有人能告诉我如何在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_ofstatic_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中没有使用TOtherClass,因此会出现编译器错误。

至于如何在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的类型是否支持给定的方法或字段。如果TOtherClass的子类型,它将成功编译。如果T不是OtherClass的子类型,则很可能它不会具有该名称的方法或字段,即使有,也可能没有正确的类型,因此可能无法编译。它基本上是鸭子打字。

(不太可能,

但有可能,您有一个不同的、不相关的类型,它不是 OtherClass 的子类型,它还具有与 OtherClass MyClass 中使用的方法和字段中的方法和字段相同的名称和类型,如果您尝试使用该类型参数化MyClass,编译器不会抱怨它。但是,无论如何,存在这样的类型可能是糟糕的设计,并且您不太可能意外地在错误的地方使用这种类型。