Я вчера читал о параметрах выражения в C ++:
http://www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/
Я знаю, почему вы используете шаблоны, но зачем использовать параметры выражения, когда вы можете просто использовать конструктор для достижения того же самого?
О, и еще одна вещь, шаблоны обрабатываются прекомпилятором?
Заранее спасибо.
Когда вы используете шаблонный класс, он будет раскрыт во время компиляции, а затем скомпилирован как обычный класс. Одна из причин использования параметра выражения вместо параметра в конструкторе заключается в том, что выражение становится частью типа. Таким образом, все объекты этого типа будут гарантированно использовать одно и то же значение.
В примере вы связались с:
// 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 — это один и тот же тип объекта, но они имеют разные размеры буфера.
Простой пример — массив C ++ 11 (и boost имел аналогичные ранее).
http://en.cppreference.com/w/cpp/container/array
Статические массивы являются одним из случаев, когда вы не можете использовать переменные, но вы можете использовать параметры шаблона.
Использование констант (параметров шаблона) может быть более эффективным и в других случаях.
Препроцессор не трогает шаблоны, он только выполняет #whatever
линии, расширяет макросы, удаляет комментарии и т. д.
Вторая часть вашего вопроса первая: нет, шаблоны компилируются; не подвергается предварительной обработке.
Что касается первой части, они невероятно полезны. Лучший (и самый простой) пример параметра выражения, который предоставляет большую функциональность в шаблонах, — это ограничение размера статических массивов:
#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.
Такие вещи невозможны без параметров выражения. Они невероятно полезны, особенно для вещей, которые требуют уменьшения размера.