Предварительная обработка / прекомпиляция — заменить переменную на константу

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

Пример. У меня есть следующая функция:

int addition_in_range_of_10 (int a, int b) {    return a+b; }

Я хочу сгенерировать следующие функции:

int addition_in_range_of_10_1_1 () {
return 2;
}

int addition_in_range_of_10_1_2 () {
return 3;
}

int addition_in_range_of_10_1_3 () {
return 4;
}

...

int addition_in_range_of_10_10_10 () {
return 20;
}

Я хочу запустить эти функции, используя указатель на функцию:

int (*funp)();
if(...) {
funp = addition_in_range_of_10_1_3;
}
funp();

Прямо сейчас я написал свое собственное приложение, которое выполняет перечисленные выше функции шаблонов, но неудобно копировать код в мое приложение, а затем приводить к файлу cpp и затем компилировать. Я хочу, чтобы это было автоматизировано.

//{A=1,2,3,4,5,6,7,8,9,10;B=1,2,3,4,5,6,7,8,9,10}
int addition_in_range_of_10_{A}_{B} () {
return {A}+{B};
}

Вот мой вопрос Есть ли какая-либо библиотека предварительной обработки, механизм или что-то, что могло бы сделать это автоматически?

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

1

Решение

Без каких-либо специальных инструментов вы можете сделать это:

#define MYADD(A,B) \
int addition_in_range_of_10_##A##_##B () { \
return A+B; \
}

#define MYADD2(A) \
MYADD(A,1) \
MYADD(A,2) \
...
MYADD(A,10)

MYADD2(1)
MYADD2(2)
...
MYADD2(10)

Но буст препроцессор может помочь вам сделать это более компактным. Посмотри на BOOST_PP_LOCAL_ITERATE,

2

Другие решения

для C ++

#include <iostream>

template <int A, int B>
int addition_in_range_of_10(void){
return A + B;
}

int main(){
int (*funp)();
if(1) {
funp = addition_in_range_of_10<1,3>;
}
std::cout << funp() << std::endl;
return 0;
}
3

По вопросам рекламы [email protected]