В моих путешествиях, я нашел три основных использования для параметров шаблона как основных типов:
Один строит шаблон функции, которая принимает массив 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
Или [tuple получает] (http://en.cppreference.com/w/cpp/utility/tuple/get). – Danstahr
Google * аргументы шаблона non-type * – Praetorian