какая польза от параметров выражения в с ++?

Я вчера читал о параметрах выражения в C ++:
http://www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/

Я знаю, почему вы используете шаблоны, но зачем использовать параметры выражения, когда вы можете просто использовать конструктор для достижения того же самого?
О, и еще одна вещь, шаблоны обрабатываются прекомпилятором?

Заранее спасибо.

2

Решение

Когда вы используете шаблонный класс, он будет раскрыт во время компиляции, а затем скомпилирован как обычный класс. Одна из причин использования параметра выражения вместо параметра в конструкторе заключается в том, что выражение становится частью типа. Таким образом, все объекты этого типа будут гарантированно использовать одно и то же значение.

В примере вы связались с:

// declare an integer buffer with room for 12 chars
Buffer<int, 12> cIntBuffer;

cIntBuffer является экземпляром класса Buffer. Гарантируется, что у вас будет буфер int размером 12. Если у вас есть:

Buffer<int> cIntBuffer1(12);
Buffer<int> cIntBuffer2(13);

cIntBuffer1 и cIntBuffer2 — это один и тот же тип объекта, но они имеют разные размеры буфера.

1

Другие решения

Простой пример — массив C ++ 11 (и boost имел аналогичные ранее).
http://en.cppreference.com/w/cpp/container/array

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

Использование констант (параметров шаблона) может быть более эффективным и в других случаях.

Препроцессор не трогает шаблоны, он только выполняет #whatever линии, расширяет макросы, удаляет комментарии и т. д.

1

Вторая часть вашего вопроса первая: нет, шаблоны компилируются; не подвергается предварительной обработке.

Что касается первой части, они невероятно полезны. Лучший (и самый простой) пример параметра выражения, который предоставляет большую функциональность в шаблонах, — это ограничение размера статических массивов:

#include <iostream>

using namespace std;

template<typename T, size_t N>
void DoSomething(const T (&ar)[N])
{
for (size_t i=0; i<N; ++i)
cout << ar[i] << endl;
}

int main(int argc, char *argv[])
{
int int_ar[] = { 1,2,3,4,5 };
DoSomething(int_ar);

char char_ar[] = {'a', 'b', 'c'};
DoSomething(char_ar);

std::string str_ar[] = {"This", "is", "a", "string", "array."};
DoSomething(str_ar);

return EXIT_SUCCESS;
}

Выход

1
2
3
4
5
a
b
c
This
is
a
string
array.

Такие вещи невозможны без параметров выражения. Они невероятно полезны, особенно для вещей, которые требуют уменьшения размера.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector