2013-10-22 28 views
0

我實際上是試圖理解C++中的一段代碼,並且在這段代碼中出現了,這裏是將數據包作爲新的數據類型?什麼是「homeDeliv」和「pickUp」。他們是在這裏定義還是在別處定義,只是在這裏使用?在C++中使用模板和結構的困惑

我是C++語法的新手。請幫忙...

template< typename Pac > struct Packets; 
    template<> struct Packets<homeDeliv> { static const unsigned ID = 0; }; 
    template<> struct Packets<pickUp> { static const unsigned ID = 1; }; 
+0

它們('homeDeliv','pickUp')被定義在其他地方。 – Zeta

+4

模板不是* OOP。跟着我重複一遍:模板遠不及OOP。事實上,您可以使用模板創建多態類型是無關緊要的。 – Griwes

+0

@Griwes,感謝和指出......我只是在考慮template關鍵字被用於許多與OOP有關的上下文中,比如重載等。所以我認爲這可能類似 – RoyOneMillion

回答

3

這些都是模板Packets明確專業。

無論何時使用Packets<homeDeliv>,都會使用該實現。

非顯式專業化使用默認模板。

struct homeDeliv {}; 
struct foo {}; 
template< typename Pac > struct Packets { static const unsigned ID = 42; } ; 
template<> struct Packets<homeDeliv> { static const unsigned ID = 0; }; 

//..... 
Packets<homeDeliv> x; 
assert (x.ID == 0); 

Packets<foo> y; 
assert (y.ID == 42); 

Packets<int> z; 
assert (z.ID == 42); 
2

這些是模板專業化。 homeDelivpickUp是在別處聲明的類型。例如,

template<> struct Packets<int> { static const unsigned ID = 42; }; 

然後

std::cout << Packets<int>::ID << "\n"; // prints 42. 
+1

夥計... 42 ...真的嗎?:D –

+0

@LuchianGrigore我從我自己的PRNG那裏得到了它。 – juanchopanza

+0

嗯......一定是使用了同樣的種子,然後...... –

0

這是一個模板專業化和homeDeliv作爲拾取都是兩種類型。

0

這是模板專業化。如果您只想爲給定類型提供功能,它通常以這種方式使用。在這種情況下homeDelivpickUp必須已經定義的其他地方,則:

template <typename> struct X; // incomplete type will cause error on instantiation 
template <> struct X<int> { /* whatever */ }; // now X<int> is valid, but all other 
               // still cause compilation errors 
1

這些模板特。

究竟是什麼「homeDeliv」和「皮卡」

它們是用戶定義的數據類型或typedef

難道他們正在這裏定義

不,他們不是這裏定義。它們必須在代碼的其他地方被定義。它們在這裏用於創建模板特化Packets