C++ 相当于`<;T扩展MyClass>;`在C++;
在Java中,您可以通过C++ 相当于`<;T扩展MyClass>;`在C++;,c++,templates,C++,Templates,在Java中,您可以通过voidmymethod(T项) cpp中是否有一个等价物?我尝试了模板类MyClass,但没有成功。阅读下面的内容时,请注意我不是Java程序员。我对Java的知识几乎完全是抽象的,可能已经过时了。因此,如果Java在上一两个版本中实现了泛型的具体化,我对此一无所知 泛型和C++模板共享一些常用的语法和用法,但它们在引擎盖下是非常不同的。 Java泛型是围绕单个核心类型自动编写的强制转换和编译时类型检查的包装 另一方面,C++模板为每组模板参数生成新的不相关类型 Ja
voidmymethod(T项)
cpp中是否有一个等价物?我尝试了
模板类MyClass
,但没有成功。阅读下面的内容时,请注意我不是Java程序员。我对Java的知识几乎完全是抽象的,可能已经过时了。因此,如果Java在上一两个版本中实现了泛型的具体化,我对此一无所知
扩展MyClass
语法有两个作用。首先,它允许泛型的“核心”类型知道T
不仅仅是一个对象,实际上是某个接口的子类。这是“core”类型安全使用方法所必需的(没有可能在运行时失败的动态强制转换)
在C++中,这是不会发生的,因为没有一个模板实例化生成的“核心”类型。每个模板实例化都是独立编译的,因此知道操作是否有效
它所做的第二件事是,当错误的类型传递给泛型时,它会给出类型错误。它所做的第三件事是允许Java在实例化泛型代码之前检查其有效性
第二,C++可以使用概念(如果你的编译器足够新)或者使用一种被称为sFIFE的技术,它同样强大,但是语法上非常糟糕,而且诚实地解决这个问题的能力是语言发展的一个意外(它是意外地完成)。
对于C++中的第三个检查模板,已经提出了很多次,但一直运行到编译时性能问题。因此,C++中没有一种方法可以做到这一点,只是例示模板。
解决:
什么都不做:
template<class T> class MyClass{
static_assert(std::is_base_of_v<Draw_Shape,T>);
};
template<class T,
std::enable_if_t<std::is_base_of_v<Draw_Shape,T>, bool> =true
>
class MyClass{
};
template<class T> requires std::is_base_of_v<Draw_Shape,T>
class MyClass{
};
不,说真的。接受duck类型,不要约束模板参数。唯一的缺点是丑陋的错误消息,很少有“同一个命名操作有不同的含义”
静态断言
:
template<class T> class MyClass{
static_assert(std::is_base_of_v<Draw_Shape,T>);
};
template<class T,
std::enable_if_t<std::is_base_of_v<Draw_Shape,T>, bool> =true
>
class MyClass{
};
template<class T> requires std::is_base_of_v<Draw_Shape,T>
class MyClass{
};
或
模板
类MyClass{
};
<>注意,概念需要一个现代C++编译器和STD库。模板和泛型是完全不同的故事。使用模板,您只需
模板void myMethod(T)
。要求从基继承是相当少见的。通常,您更希望在T
上需要所需的操作(并且T
是否支持这些操作,因为它继承自MyClass
,或者通过其他一些方式并不相关)不,没有等价物。您可能应该将问题集中在您想要实现的目标上,并展示一些示例代码。在C++17和更早的版本中,可以使用SFINAE限制模板参数。C++20和更高版本也有一些概念,这些概念将更接近Java的扩展。这两个都是相当先进的C++主题,你可以在C++的教科书中找到更多的信息和完整的解释。既然你提到了概念,那么值得注意的是:代码> STD::从t<代码>派生。它与实际的Java语法非常接近。