Формат шаблона в C ++ - PullRequest
       1

Формат шаблона в C ++

0 голосов
/ 24 июня 2011

Я наткнулся на следующий фрагмент в реализации N-арного дерева в учебнике:

template <typename Object, int N>

Насколько я понимаю, основная цель шаблона состоит в том, чтобы обеспечить "универсальность" кода так,что конкретная переменная может быть любого типа, представленного через Object

, т.е. если у вас есть template <typename Object>, тогда мы можем написать следующее в коде: Object variable1;, где Object любого типа.

Исходя из моего описания,

1) Указывая конкретный тип переменной (в данном случае int для N), мы не идем вразрез с основным назначением шаблонов?

Тогда ...

2) Зачем нам это делать?Не лучше ли включить в конструктор переменную N?

Ответы [ 4 ]

1 голос
/ 24 июня 2011

В C ++ шаблоны могут быть созданы не только для типов.Они могут быть созданы для конкретных значений, если программист этого пожелает.В template<int N> class Foo N рассматривается как константа, если вы: создадите экземпляр этого шаблона и зададите для константы N это значение .

Например, массивы должны иметь фиксированныйразмер (именно так они, по определению, и должны себя вести).Следовательно, они должны быть шаблонными с заданным постоянным размером.В следующем стандарте C ++ вы можете создать экземпляр массива, выполнив std::array<int, 7>;это объект типа array-of-ints-size-seven - да, размер является характеристикой типа массива.

В двух словах, C ++ также позволяет создавать экземпляры шаблонов сзначения, а не только с типами, потому что определенные типы должны быть определены постоянным значением.В приведенном мной примере размер массива является характеристикой типа, а не объекта.

1 голос
/ 24 июня 2011

Одной из причин указания значения чего-либо с помощью аргументов шаблона (а не аргумента конструктора) является то, что оно позволяет наследовать значение производным классам.

Кроме того, некоторые постоянные переменные внутри класса не могут бытьинициализирован с использованием аргумента конструктора ... вот пример ad hoc , чтобы показать вам, что я имею в виду.

template <int n>
struct test
{
    int a:n;
    int b:32-n;
};
1 голос
/ 24 июня 2011

Ваше понимание частично неверно.

Указывая конкретный тип переменной (в данном случае int для N), мы не идем вразрез с основным назначением шаблонов?

Нет, потому что эти нетиповые параметры шаблона теперь позволяют вам быть более конкретными. Давайте возьмем std::array<T,N> из C ++ 0x в качестве примера. По сути, это полноценный статический массив, такой как int arr[10];, но с интерфейсом контейнера и итераторами, что является более универсальным решением.

Зачем нам это делать? Разве не лучше включить переменную N в конструктор?

Если вы пропустите N, то есть размер, тогда это будет не более чем std::vector<T>, и вам придется динамически распределять массив внутри. Нетипичные параметры шаблона помогают значительно перенести нагрузку со времени выполнения на время компиляции, как в случае с std::array, если вы заранее знаете количество элементов.

0 голосов
/ 24 июня 2011

Назначение шаблонов более общее, чем просто замена типов. Иногда есть преимущества, которые можно получить, зная целочисленное значение во время компиляции. Система шаблонов спроектирована так, чтобы быть достаточно гибкой, чтобы разрешить такой вид использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...