Помогите с макро функциями - PullRequest
2 голосов
/ 31 мая 2011

Имеется много встроенных функций с одинаковыми сигнатурами.Все функции малы и критичны по производительности.

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;
}

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

Есть ли способ сделать это с помощью макросов?Макрос, который может генерировать функции высокого уровня автоматически?

#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

Возможно ли это?

Спасибо.

PS Я мог бы использовать функциональные объекты, но он должен работать в Cтоже.

Ответы [ 3 ]

10 голосов
/ 31 мая 2011

Почему бы не использовать шаблоны?

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, ~)
3 голосов
/ 31 мая 2011

Мне трудно увидеть сложность:

#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; \
}

или я что-то пропустил?

1 голос
/ 31 мая 2011

Вы можете сделать это легко с Boost.Preprocessor , который не требует компилятора C ++.Используя BOOST_PP_REPEAT, вы можете легко генерировать n функции (вы должны определить n, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...