В C аргументы шаблона должны быть константными выражениями. Это означает, что их значения должны быть известны во время компиляции. Компилятор не может вычислить непостоянную переменную в этом контексте.
Рассмотрите код:
template
void modify(){}
Чтобы передать непостоянную переменную в качестве аргумента шаблона, мы могли бы написать:
for(int i = 0; i ();
}
Однако это вызывает ошибку, поскольку компилятор не может определить значение i во время компиляции. Тело цикла может выполняться несколько раз, изменяя значение i.
Вместо прямой передачи непостоянной переменной мы можем использовать специализацию шаблона для реализации итеративный вызов:
#include
template
void modify() { std::cout "
void modify() { std::cout "
void modify() {
std::cout " ();
}
int main() {
modify();
}
Чтобы вызвать модификацию со значением, которое неизвестно во время компиляции, мы можем использовать метод, называемый метапрограммированием шаблонов. Вот упрощенный пример:
#include
template <:tuple>>
struct TupleSize;
template
struct TupleSize<:tuple>> {
static const int value = sizeof...(Args);
};
template
void callModify(int i) {
if constexpr (i ();
callModify(i 1);
}
}
int main() {
int n = 10;
callModify::value>(0);
}
В этом примере callModify принимает параметр N, который представляет собой размер кортежа, содержащего желаемый диапазон значений для i. Функция использует рекурсивную метапрограмму для генерации вызовов для изменения до указанного размера N.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3