0

实际上,我试图理解 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; };
4

5 回答 5

3

这些是模板的明确专业化Packets

每当您使用 aPackets< 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 );
于 2013-10-22T09:23:01.027 回答
2

这些是模板特化。homeDeliv并且pickUp是类型,在别处声明。例如,

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

然后

std::cout << Packets<int>::ID << "\n"; // prints 42.
于 2013-10-22T09:22:54.840 回答
1

这些是模板特化。

“homeDeliv”和“pickUp”到底是什么

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

它们是在这里定义的吗

不,它们没有在这里定义。它们一定是在代码的其他地方定义的。它们在这里用于创建模板特化Packets

于 2013-10-22T09:25:53.943 回答
0

它是模板专业化,而 homeDeliv 作为pickUp 都是两种类型。

于 2013-10-22T09:23:13.130 回答
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
于 2013-10-22T09:24:55.860 回答