C++如何告诉开发人员在设计模板(如Java接口)时实现某事

C++ how to tell developer to implement sth. when designing a template (like Java interface)

本文关键字:接口 Java 实现 开发 何告诉 C++      更新时间:2023-10-16

我是C++的新手,我有这个问题是因为我试图将C++与Java进行比较。

在Java中,interface告诉开发人员要实现哪个函数,以便使用我提供的类或函数。例如,通过将参数类型指定为Runnable,我告诉开发人员我接受的参数需要run方法,Iterable告诉对象需要迭代器。

在C++中,据我所知,我遇到过很多情况,在编译时,编译器需要一些运算符。有时我甚至不知道如何指定其他人传入的参数的要求

总结一下我的问题,在设计一个我希望能够处理更通用用法的模板时,方法的总体思路是什么?

我知道C++不是一种100%面向对象的语言,所以在从Java转换时,我仍在努力适应它。

AFAIK Java接口用于运行时多态性;在C++中,它们是只包含纯虚拟方法的普通类。Java需要一个单独的语言实体,因为它只支持类的单一继承(这简化了许多角落的情况(,但允许接口的多重继承;由于C++通常允许类的完全多重继承,因此没有必要进行这种区分。

OTOH,在C++中,你几乎不经常使用接口——尤其是在标准库中,尤其是在容器部分。通常以模板的形式使用编译时多态性。

不幸的是,到目前为止,还没有办法表达模板的类型参数应该提供什么操作;C++标准委员会正在开发与接口等效的模板"概念",但不幸的是,多年以来,它还没有准备好。

目前,您只能在文档中详细说明您的需求。如果传递给模板的类型不满足它们,您只会得到一个编译错误,指向试图执行该类型不支持的操作的模板代码。这会导致一些混乱和可怕的错误消息,因此您可以尝试通过战略性地将static_assert放在所提供的类型中来缓解这种情况,检查它是否符合您的需求,从而在出现错误时提供更好的诊断。