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

Как добиться постоянного вычисления с помощью аргументов шаблона, если аргумент неизвестен во время компиляции?

Опубликовано 20 ноября 2024 г.
Просматривать:442

How Can I Achieve Constant Evaluation with Template Arguments When the Argument Is Not Known at Compile Time?

Оценка константы аргумента шаблона

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