问题描述
虽然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
,因此您可以在代码中使用它们,但请记住,这样做有缺点。