«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему непостоянные переменные нельзя использовать в качестве аргументов шаблона в C++?

Почему непостоянные переменные нельзя использовать в качестве аргументов шаблона в C++?

Опубликовано 12 января 2025 г.
Просматривать:131

Why Can\'t Non-Constant Variables Be Used as Template Arguments in C  ?

Почему непостоянную переменную нельзя передать в качестве аргумента шаблона?

В C аргументы шаблона должны быть константными выражениями. Это означает, что их значения должны быть известны во время компиляции. Компилятор не может вычислить непостоянную переменную в этом контексте.

Рассмотрите код:

template 
void modify(){}

Чтобы передать непостоянную переменную в качестве аргумента шаблона, мы могли бы написать:

for(int i = 0; i ();
}

Однако это вызывает ошибку, поскольку компилятор не может определить значение i во время компиляции. Тело цикла может выполняться несколько раз, изменяя значение i.

Достижение цели без изменения API

Вместо прямой передачи непостоянной переменной мы можем использовать специализацию шаблона для реализации итеративный вызов:

#include 

template
void modify() { std::cout " 
void modify() { std::cout " 
void modify() {
    std::cout " ();
}

int main() {
    modify();
}

Вызов 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