【问题标题】:Preprocessing/precompiling - replace variable by constant预处理/预编译 - 用常量替换变量
【发布时间】:2014-04-20 11:12:24
【问题描述】:

我正在开发一个函数,该函数采用众所周知的参数范围,但我不想为每种情况编写许多不同的函数。有没有办法定义一个函数的“模式”并让预编译器根据这个模式生成函数?

示例。我有以下功能:

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

这是我的问题。是否有任何预处理库、机制或可以自动执行的东西?

出于性能考虑,我只想从代码中删除变量。这些函数要复杂得多,如果有常量而不是变量,效果会更好,而且因为这些变量只使用一些众所周知的值,所以我想将它们更改为常量而不是变量。

【问题讨论】:

  • 您似乎要创建一个查找表。
  • 没有冒犯,但你不相信你的编译器能正确乘法吗? :)
  • 我认为这是一个人为的例子,只是为了说明您正在寻找的机制。问题是,它如此 做作,很难在这里提出任何明智的建议。您要解决的真正问题是什么?
  • @nosbor:不过,这些都是等价的问题。如果你在运行时有a=5b=7,你不能在没有查找表机制的情况下调用expensiveFunction_5_7()
  • @nosbor 函数指针将比 const 查找数组或 constexpr 函数慢很多。

标签: c++ c c-preprocessor metaprogramming precompile


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    无需任何特殊工具即可:

    #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 preprocessor 可以帮助您使其更紧凑。看看BOOST_PP_LOCAL_ITERATE

    【讨论】:

    • 这就是我想要的。谢谢!
    • 我认为你在 MYADD2 后面漏掉了一个 #define ,除非我是那个漏掉的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多