在我的旅行中,我发现模板参数作为基本类型的三个主要用途:
一种是构建一个采用 C 样式数组的函数模板。这就是您在此处发布的内容,但更常见的是我看到这适用于char
数组,例如:
template <size_t N, typename Char>
string MakeString (Char const (&chars)[N])
{
return string (chars, N);
}
int main()
{
string hi = MakeString ("Hello");
cout << hi;
}
另一个用途是使用模板元编程构建一种廉价的属性系统。例如,假设您有一堆用于表示某些有线协议中的消息的类,并且出于测试目的,您希望将消息类的实际大小与规范所说的大小进行比较。
enum MsgType
{
MsgType_Foo,
MsgType_Bar
};
class FooMsg
{
uint32_t mField;
char mName [9];
};
class BarMsg
{
char mPrice [8];
static const size_t SpecSize = 8;
};
template <MsgType MT> size_t SpecSize();
template <> size_t SpecSize <MsgType_Foo> ()
{
return 13;
}
template <> size_t SpecSize <MsgType_Bar> ()
{
return 9;
}
int main()
{
assert (SpecSize <MsgType_Foo> () == sizeof (FooMsg));
assert (SpecSize <MsgType_Bar> () == sizeof (BarMsg));
}
请注意,如果您运行此程序,除非您执行特定于平台的操作(例如#pragma pack (push, 1)
)来修复打包,否则断言将失败。这是测试旨在捕获的内容之一!
最后,另一个常见的用途更具体,但该技术可以应用于您自己的代码。在 Boost.Tuple 和现在的 C++11 中,tuple
该类使用模板函数get<size_t>
作为访问元素的方法。这是取自en.cppreference.com的示例:
#include <iostream>
#include <string>
#include <tuple>
int main()
{
auto t = std::make_tuple(1, "Foo", 3.14);
// index-based access
std::cout << "(" << std::get<0>(t) << ", " << std::get<1>(t)
<< ", " << std::get<2>(t) << ")\n";
}
我想您可以将其视为前面两个示例的专业化。它是更多模板元编程技巧,在某些情况下非常有用。