2010-08-10 73 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