Стоит ли писать код как следующее, чтобы скопировать элементы массива:C++ Метапрограммирование с шаблонами по сравнению встраивания
#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'. Вы можете быть почти уверены, что *, который * использует некоторые методы метапрограммирования для пересылки копий между массивами int в memmove. – UncleBens
Христос, я бы предпочел потратить 10 прожекторов программирования на жизнь, чем тратить больше времени на метапрограммирование времени компиляции C++ :(Если вам нужно что-то скопировать, вы должны его скопировать, вы не можете уйти от него, думая, что можете сделать он во время компиляции только потому, что вы считаете, что можете идентифицировать переменные, которые будут скопированы. –
@ Хассан: В зависимости от типов данных и выравнивания могут быть подходящими различные стратегии копирования, и возможно, что можно быстро увеличить скорость работы. это не «просто копия». (Но, как пишет @UncleBens, 'std :: copy' уже делает это) – jalf