Во-первых, вы пишете функции.Таким образом, метапрограммирование или нет, компилятор будет генерировать функции.И поскольку функции не будут оцениваться до времени выполнения, ваш подход не приведет к сокращению времени выполнения.На самом деле, это может добавить немного накладных расходов, когда вы развертываете цикл for в рекурсивном вызове функции.
Чтобы ответить на более общий вопрос, с мета-программированием шаблона вы можете вычислять вещи только на время компиляции .Стандартный способ состоит в том, чтобы предварительно вычислить нужные значения и сохранить их как элементы в объекте.И вы можете использовать только такие типы, как enum (те, которые не нуждаются в конструкторе) для вычисления вещи во время компиляции, так как все вызовы конструктора выполняются во время выполнения.
Мета-программирование в большинстве случаев не практично,Вы можете использовать его как хороший инструмент для изучения шаблонов, но это приводит к большим двоичным файлам и не поддерживаемой базе кода.Поэтому я бы посоветовал вам не использовать его, если вы не изучили другие параметры, такие как справочные таблицы.
Вы можете работать с произвольными массивами, только если они уже определены в вашем коде.Например,
int a1[] = {1,2,3};
int a2[] = {2,4,5};
template <int N,typename T>
struct foo {
int product;
foo<N-1,T> rest;
foo(const T* array1,const T* array2) : rest(array1+1,array2+1) { product = array1[0] * array2[0] + rest.product; }
};
template <0,typename T>
struct foo {
int product;
// These addresses are stale, so don't use them
foo(cons T* array1, const T* array2) : product(0) {}
};
foo<3,int> myfoo(a1,a2);
И вы можете использовать myfoo.product для получения значения перекрестного произведения a1 и a2, вычисленного во время компиляции.