预处理/预编译 - 用常量替换变量

时间:2014-04-20 11:12:24

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

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

实施例。我有以下功能:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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