#c #c #macros
Вопрос:
Учитывая множество встроенных функций с идентичными сигнатурами. Все функции малы и имеют решающее значение для производительности.
int inline f1(int);
int inline f2(int);
...
int inline f5(int);
Мне нужно написать функции высокого уровня для автоматизации определенных задач — по одной функции высокого уровня на каждую встроенную функцию. n-я функция высокого уровня использует только n-ю функцию низкого уровня, в противном случае все функции высокого уровня идентичны.
int F_n(int x) {
int y;
// use n-th low level function to compute y from x
// for example
y = x*f_n(x);
return y;
}
Я мог бы использовать указатели функций для обратного вызова, но я думаю, что это предотвратит наклон, и производительность пострадает. Или я мог бы просто скопироватьamp;paster и вручную исправить имена функций.
Есть ли способ сделать это с помощью макросов? Макрос, который может автоматически генерировать функции высокого уровня?
#define GEN_FUNC( HIGH_LEVEL_FUNC, LOW_LEVEL_FUNC )
???????
???????
GEN_FUNC(F1, f1); // generate F1
GEN_FUNC(F2, f2); // generate F2
.........
GEN_FUNC(F_N, f_N); // generate F_N
Возможно ли это?
Спасибо.
P.S. Я мог бы использовать объекты функций, но это должно работать и на C тоже.
Комментарии:
1. Я бы порекомендовал советы @xDD и использовал шаблоны. Да, макросы позволяют вам делать это как на C, так и на C , но макросы трудно выполнять правильно и они не связаны правилами пространства имен/области действия, что в первую очередь было одной из основных причин, лежащих в основе встроенных функций.
Ответ №1:
Почему бы не использовать шаблоны?
template <int N>
int inline f(int);
template <>
int inline f<1>(int);
template <>
int inline f<2>(int);
template <>
int inline f<3>(int);
...
template <int N>
int F(int x)
{
int y;
y = x * f<N>(x);
return y;
}
Изменить: Если это должно работать на C, используйте макрос, подобный этому:
#define GENERATE_FUNCTION(n)
int F_ ## n(int x) {
int y;
y = x*f_ ## n(x);
return y;
}
И используя BOOST_PP_REPEAT:
#define GENERATE_FUNCTION_STEP(z, n, unused) GENERATE_FUNCTION(n)
BOOST_PP_REPEAT(N, GENERATE_FUNCTION_STEP, ~)
Комментарии:
1. @ildjarn: Да, я только что прочитал это и уже добавил версию на C 😉
Ответ №2:
Мне трудно понять, в чем трудность:
#define GEN_FUNC( HIGH_LEVEL_FUNC, LOW_LEVEL_FUNC )
inline int HIGH_LEVEL_FUNC(int x) {
int y;
y = x*LOW_LEVEL_FUNC(x);
return y;
}
или я что-то пропустил?
Ответ №3:
Вы можете легко сделать это с помощью Boost.Препроцессор, для которого не требуется компилятор C . Используя BOOST_PP_REPEAT, вы можете легко создавать n
функции (вы, конечно, должны определить n
.