Метапрограммирование 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;
   }

} // () 

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

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

5
задан Ned Batchelder 14 July 2010 в 23:47
поделиться

3 ответа

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

8
ответ дан 14 December 2019 в 01:06
поделиться

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

1
ответ дан 14 December 2019 в 01:06
поделиться

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

0
ответ дан 14 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: