Оценка константы аргумента шаблона
1. Почему компилятор не может вычислить 'i' во время компиляции?
Вычисление во время компиляции требует, чтобы значение 'i' было известно до выполнения программы. Однако в предоставленном коде «i» — это переменная цикла, которая изменяется во время выполнения программы. Компилятор не может определить значение 'i' во время компиляции, поскольку это динамически присваиваемое значение.
2. Могу ли я достичь цели, не изменяя интерфейс API?
Да, вы можете использовать специализацию шаблона для создания рекурсивной функции, которая перебирает диапазон аргументов шаблона. Например, вы можете создать функцию:
template
void modify_recursive() {
// Call modify with template argument 'i'
modify();
// Recursively call modify_recursive with the next template argument
if (i ();
}
}
Вызов «modify» с непостоянным аргументом
Чтобы вызвать «modify» со значением, которое не является константой времени компиляции, вы можете использовать метод, называемый метапрограммированием шаблонов. Один из подходов — создать класс шаблона, который принимает объект функции в качестве аргумента и вызывает его с желаемым значением:
template
struct InvokeWithParam {
InvokeWithParam(F f, int param) : f(f), param(param) {}
void operator()() { f(param); }
F f;
int param;
};
Затем вы можете передать экземпляр InvokeWithParam в качестве аргумента шаблона для изменения:
int var = 5;
modify();
Это вызовет функцию изменения со значением var.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3