Я думаю, вам будет очень трудно найти более четкое выражение того, что говорится в цитируемых параграфах.Я думаю, они очень хорошо объясняют проблему.
Если вам все еще нужна помощь, чтобы понять идею, попробуйте сначала понять три ключевых слова: template , параметр и аргумент .Вот мое определение:
A параметр шаблона является частью определения шаблона, в то время как аргумент шаблона - это то, что передается в шаблон для создания шаблонадля генерации конкретного типа.
Шаблон - это функция, которую можно параметризировать.В вашем примере Dozen - это шаблон:
template <typename T>
class Dozen
{
...
};
, где T - это параметр Dozen шаблона.Вкратце, T - это параметр шаблона .
Возможно, поможет простая аналогия.Думайте о шаблоне (здесь это Дюжина ) как слепок скульптуры, который может быть заполнен жидким материалом, который установит внутри броска принятие его формы и в конечном счете произведет скульптуру.Теперь параметр T подобен жидкому материалу (резина, металл, стекло и т. Д.), Который придает скульптуре определенные символы.Таким образом, вы можете использовать одно и то же приведение для создания серии похожих скульптур.
Таким образом, полая полость в представлении представляет собой T параметр шаблона, заполнитель, в который вы будете помещать аргументы шаблона, где вызаполните шаблон.
Итак, это примерно идея параметризации в метапрограммировании.
Переход к аргументу шаблона и пример с комментариями:
// T states parameter of Dozen template
template <typename T>
class Dozen
{
// the T is argument used to instantiate concrete type from another template
ArrayInClass<T,12> contents;
};
Здесь выможет подумать о функции, вызывающей другую функцию и передающей параметр:
void foo(int a)
{
bar(a);
}
foo
не использует саму себя, но передает ее в качестве аргумента bar
.Аналогичным образом, Dozen пересылает свой собственный параметр шаблона T в качестве аргумента для шаблона ArrayInClass
, чтобы создать конкретный тип этого ArrayInClass
.
Наконец, T является компилируемымвыражение времениЭто означает, что это дает значение во время компиляции.(Выражения - это функции языка программирования, которые дают значение).Значением выражения является тип ( T ) или числовая константа ( 12 ).
ArrayInClass<T,12>
также является выражением времени компиляции, которое приводит к созданию экземпляраArrayInClass
шаблон для производства конкретного типа.Вкратце, выражение типа компиляции может быть использовано для создания другого выражения времени компиляции - для получения другого (сложного) значения.
В метапрограммировании хорошая идея не думать о value сномер или строка.Тип также является значением здесь.