在我的旅行,我已经找到了模板参数为基本类型三个主要用途:
之一就是建立一个函数模板,需要一个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";
}
我想你可以认为这是两个前面的例子中的一个特例。这是更多的模板元编程技巧,结果在某些情况下非常有用。例如,
'std :: array'。 –
juanchopanza
或[元组获取](http://en.cppreference.com/w/cpp/utility/tuple/get)。 – Danstahr
Google *非类型模板参数* – Praetorian