Я работаю над функцией, которая принимает хорошо известный диапазон аргументов, но я не хочу писать много разных функций для каждого случая. Есть ли способ определить, скажем, «шаблон» функции и заставить прекомпилятор генерировать функции на основе этого шаблона?
Пример. У меня есть следующая функция:
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};
}
Вот мой вопрос Есть ли какая-либо библиотека предварительной обработки, механизм или что-то, что могло бы сделать это автоматически?
Я просто хочу удалить переменные из кода из-за производительности. Эти функции намного сложнее и работают намного лучше, если вместо переменных есть константы, а поскольку эти переменные используют только некоторые хорошо известные значения, я хотел бы заменить их на константы вместо переменных.
Без каких-либо специальных инструментов вы можете сделать это:
#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
,
для 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;
}