在c ++中使用模板和结构时的困惑

时间:2013-10-22 09:20:49

标签: c++

实际上,我试图理解c ++中的一段代码,并且来自这个片段,这里的Packet是一个新的数据类型吗?什么是“homeDeliv”和“pickUp”。它们是在这里定义还是在其他地方定义,只是在这里使用?

我是C ++语法的新手。请帮忙......

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

5 个答案:

答案 0 :(得分: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 );

答案 1 :(得分:2)

这些是模板专精。 homeDelivpickUp是其他类型的类型。例如,

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

然后

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

答案 2 :(得分:1)

这些是模板专精。

究竟是什么“homeDeliv”和“pickUp”

它们是用户定义的数据类型或typedef

这里是否定义了

不,这里没有定义它们。它们必须已在代码中的其他位置定义。这里使用它们来创建Packets

的模板特化

答案 3 :(得分:0)

这是一个模板专业化,homeDeliv作为pickUp都是类型。

答案 4 :(得分: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