C ++ метапрограммирование с шаблонами против встраивания - PullRequest
5 голосов
/ 04 марта 2010

Стоит ли писать код, подобный следующему, для копирования элементов массива:

#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;
   }

} // () 

или лучше использовать встроенную функцию?

Первый недостаток заключается в том, что вы можете 't использовать переменные в шаблоне.

Ответы [ 4 ]

8 голосов
/ 04 марта 2010

Это не лучше. Прежде всего, это не совсем время компиляции, так как вы делаете здесь вызовы функций. Если вам повезет, компилятор встроит их и в итоге получит цикл, который вы могли бы написать сами с гораздо меньшим количеством кода (или просто используя std::copy).

1 голос
/ 04 марта 2010

Общее правило: Используйте шаблоны для вещей, известных во время компиляции, используйте вставку для вещей, известных во время выполнения. Если вы не знаете размер вашего массива во время компиляции, не используйте для него шаблоны.

0 голосов
/ 18 ноября 2014

Это лучше, потому что вы сами контролируете и применяете цикл развертки.

Цикл может быть развернут компилятором в зависимости от параметров оптимизации ...

Тот факт, что копирование с помощью copy является почти лучшим, не является хорошим общим ответом, потому что развертывание цикла может быть выполнено независимо от вычислений, выполненных внутри ...

0 голосов
/ 04 марта 2010

Ты не должен этого делать. Шаблоны были придуманы для разных целей, а не для расчетов, хотя вы можете это сделать. Во-первых, вы не можете использовать переменные, вторые шаблоны будут создавать огромные неиспользуемые структуры при компиляции, а третий: использовать for (int i = start; i <= end; i++) b[i] = a[i];

...