2010-08-10 174 views
0

我有点困惑如何在c + +中的模板和泛型工作。java泛型和c + +模板

public class Box<T> { 

    private T t;   

    public void add(T t1) { 
     this.t = t1; 
    } 

    public T get() { 
     return t; 
    } 

    public <U> void inspect(U u){ 
     System.out.println("T: " + t.getClass().getName()); 
     System.out.println("U: " + u.getClass().getName()); 
    } 

    public static void main(String[] args) { 
     Box<Integer> integerBox = new Box<Integer>(); 
     integerBox.add(new Integer(10)); 
     integerBox.inspect(10); 
    } 
} 
+1

您是否对泛型感到困惑?或者关于Java和C++泛型编程之间的差异?如果你关心后者,请参见[C++和Java中的“泛型”类型之间的区别是什么?](http://stackoverflow.com/questions/36347/what-are-the-differences-between-generic -types-in-c-and-java) – 2010-08-10 02:28:07

+1

如果你想了解模板,我认为你问的是错误的问题。 Java泛型和C++模板虽然看起来语法非常相似,但它们只是模糊的类似的构造,而且更类似。你的例子也依赖于自动装箱,这是C++中的空概念。 C++没有自动装箱,也从来不会,因为它没有任何意义。最接近的C++获得的是自动转换,但它们并非真的非常类似于自动装箱。 – Omnifarious 2010-08-10 03:31:03

回答

0

我不这么认为是获得一个真正的回答这个问题的地方,因为有可用的参考点的数量:如果有人解释我这个java代码怎么会C++将是有益的网络和足够的答案将需要大量的打字。也就是说,你应该知道C++模板和Java泛型非常不同。它们可能看起来相同,但适用完全不同的规则。 C++为每个专业化生成代码,而Java在运行时丢弃类型信息并生成隐式安全转换。苹果和橘子。其实,更像金橘和螺丝刀。

4
#include <iostream> 
#include <typeinfo> 

template <class T> 
class Box { 
public: 
    void add(const T &t1) { t = t1; } 

    T get() const { return t; } 

    template <class U> 
    void inspect(const U &u) const { 
     ::std::cout << "T: " << typeid(t).name() << "\n"; 
     ::std::cout << "U: " << typeid(u).name() << "\n"; 
    } 

private: 
    T t; 
}; 

int main(int argc, const char *argv[]) 
{ 
    Box<int> integerBox; 
    integerBox.add(10); 
    integerBox.inspect(10); 
    return 0; 
} 

这是一个粗略的翻译。因为您必须使用引用/指针来引用Java中的任何对象,所以在C++中,您可以直接使用它。但基本上就是这样。

如果你想进一步混乱,你可以有这样的main

#include <string> // You could put this line at the top of the file, 
        // but it doesn't have to be there. 

int main(int argc, const char *argv[]) 
{ 
    Box<int> integerBox; 
    Box<::std::string> stringBox; 
    integerBox.add(10); 
    integerBox.inspect(10); 
    stringBox.add("Hello World!"); 
    stringBox.inspect("Hello World!"); 
    return 0; 
} 

主要是我想你会发现的stringBox.inspect("Hello World!");输出是最复杂的。

+0

看起来很可怕的神。好东西,我从来没有碰过C++ – TheLQ 2010-08-10 04:14:06

+1

@主奎克斯塔:你有权接受你的意见。就我个人而言,我对Java非常相似。 – Omnifarious 2010-08-10 06:30:22

3

其实你可以把C++模板和Java泛型作为极性对立面

C +模板创建新类型。

Java泛型限制现有类型。

0

我写了一个博客文章前一段时间,很快总结Java泛型和C++模板之间的区别,你也可能感兴趣的:this blog post

设置类模板的类型(在C的过程++ )或通用称为模板专业化或泛型专业化。从第一个角度来看,泛型和C++模板可能看起来非常相似,但重要的是编译器如何将其翻译为引擎

Java泛型只是简单地提供编译时安全性并且不需要强制转换。它们由Java编译器直接实现为前端转换,也称为类型擦除。编译器基本上只是擦除所有通用规格(在尖括号之间)并在必要时插入强制转换。此外,它会在内部跟踪泛型,以便所有实例在编译/运行时都使用相同的底层泛型类。因此它是一种代码翻译或重写的过程。

A C++模板无论何时使用新类实例化模板,都会得到转载(代码生成)并重新编译。这可能会对性能产生影响。 此外,潜在的错误发生在最后一个可能的时刻,在运行时正在被使用,即模板被实例化和使用。

Java泛型为您提供编译时安全性。

+1

请不要使用缩小的网址。 – 2010-08-10 09:45:48

+0

@Alexandre通过扩展名被自动复制,但只是为了好奇:为什么我不应该使用它们? – Juri 2010-08-10 09:51:29

+0

因为读者不知道他们指的是什么。请参阅http://meta.stackexchange.com/questions/29518/can-and-should-stack-overflow-automatically-rewrite-bit-ly-links – 2010-08-10 10:14:47