Помощь в работе с макрофункциями

#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 .