Это стоящий, чтобы писания код как следующее для копирования элементов массива:
#include <iostream>
using namespace std;
template<int START, int N>
struct Repeat {
static void copy (int * x, int * y) {
x[START+N-1] = y[START+N-1];
Repeat<START, N-1>::copy(x,y);
}
};
template<int START>
struct Repeat<START, 0> {
static void copy (int * x, int * y) {
x[START] = y[START];
}
};
int main () {
int a[10];
int b[10];
// initialize
for (int i=0; i<=9; i++) {
b[i] = 113 + i;
a[i] = 0;
}
// do the copy (starting at 2, 4 elements)
Repeat<2,4>::copy(a,b);
// show
for (int i=0; i<=9; i++) {
cout << a[i] << endl;
}
} // ()
или лучше использовать встроенную функцию?
Первый недостаток состоит в том, что Вы не можете использовать переменные в шаблоне.
Это не лучше. Во-первых, это не совсем время компиляции, поскольку здесь вы выполняете вызовы функций. Если вам повезет, компилятор встроит их и закончит цикл, который вы могли бы написать сами с гораздо меньшим объемом кода (или просто используя std :: copy
).
Общее правило: используйте шаблоны для вещей, известных во время компиляции, используйте встраивание для вещей, известных во время выполнения. Если вы не знаете размер вашего массива во время компиляции, не используйте для него шаблоны.
Вы не должны этого делать. Шаблоны придуманы для разных целей, а не для расчетов, хотя можно. Во-первых, вы не можете использовать переменные, вторые шаблоны создадут огромное количество неиспользуемых структур при компиляции, а третье: используйте for (int i = start; i <= end; i ++) b [i] = a [i] ;