为什么 C++ 不使用 Java 之类的泛型类型擦除?

问题描述

虽然Java的类型擦除有明显的优势(主要是减少生成的代码)为什么C++没有这个特性?我知道这种类型的泛型有许多其他限制,比如你不能在函数内部使用泛型类型(因为它被删除了),你只能将“类”类型传递给它,而不是像 C++ 等中的原始类型等等。

但是如果需要,C++ 可以同时拥有...当用户想要在函数内部使用类型时,他可以使用模板样式,否则他可以在泛型类/函数声明期间使用类型擦除样式。为什么不是这样?我不想要任何基于意见的答案.. 究竟是什么阻止了这种情况?

编辑
例如,

class A {
    virtual void do_something() {}
};

class B: public A {
    virtual void do_something() {}
};

template <class T>
void call_do_something(T arg) {
    arg.do_something();
}

int main {
    A a = new A()
    call_do_something(a);
    B b = new B()
    call_do_something(b);
    retrun 0;
}

据我所知,编译时,这会生成两种版本的 call_do_something,一种用于 A,一种用于 B。但 Java 中的等效代码只会产生一种。这将减少使用容器时生成的代码。这是我想知道的示例用例,如何有效处理。我绝不是想说 Java 在所有情况下都比 C++ 具有更好的泛型。抱歉造成混乱。

解决方法

你认为的优势,其他人可能认为是劣势。例如,类型擦除访问意味着您要为访问支付性能损失,并且不能在编译时进行静态类型检查。

C++ 中有类型擦除的函数对象 - std::function,因此您可以在代码中使用它们,但请记住,这样做有缺点。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...