【问题标题】:Help with macro functions宏功能帮助
【发布时间】:2023-05-09 17:34:01
【问题描述】:

给定许多具有相同签名的内联函数。所有功能都很小,性能很关键。

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

有可能吗?

谢谢。

附:我可以使用函数对象,但它也应该在 C 中工作。

【问题讨论】:

  • 我会推荐@xDD 的建议并使用模板。是的,宏允许您在 C 和 C++ 中执行此操作,但宏很难正确执行,并且不受命名空间/范围规则的约束——这首先是内联函数背后的主要动机之一。跨度>

标签: c++ c macros


【解决方案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, ~)

【讨论】:

  • @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】:

    您可以使用不需要 C++ 编译器的 Boost.Preprocessor 轻松完成。使用 BOOST_PP_REPEAT 可以轻松生成n 函数(当然你必须定义n

    【讨论】: