在C++中自动生成代码

ale*_*t87 2 c++ code-generation

我想要一段不涉及循环但自动生成一些C++代码的代码.

我有一个const int d,从这里我想编写d行代码来访问一个数组.所以举个例子

for(int k=0; k<d;++k){
  // do something to myarryay[k];
}
Run Code Online (Sandbox Code Playgroud)

但我不想在for循环中写这个.我希望编译器执行,就好像编写了以下代码行:

do something to myarray[0]
do something to myarray[1]
.
.
.
do something to myarray[d]
Run Code Online (Sandbox Code Playgroud)

任何人都可以给我一些建议吗?

提前致谢.

Eme*_*ger 6

您确定需要手动执行此操作吗?这是一种称为循环展开的优化.在足够高的优化级别,您的编译器将为您完成,并且可能比您更好,因为优秀的优化编译器将考虑权衡(减少指令缓存局部性,一个).


Jam*_*lis 5

你应该很少需要手动展开循环(我会说永远不会,但如果你正在处理具有疯狂性能要求的东西并且你认为你可以单独使用编译器优化器,那么也许你可以手动展开循环).

如果由于某种原因确实需要这样做,那么在预处理器的帮助下它非常简单:

#include <boost/preprocessor.hpp>

#include <iostream>

void f(int x) { std::cout << x << std::endl; }

int main()
{
    #define MYARRAY_COUNT 10
    int myarray[MYARRAY_COUNT] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    #define GENERATE_ELEMENT_CASE(z, n, data) f(myarray[n]);

    BOOST_PP_REPEAT(MYARRAY_COUNT, GENERATE_ELEMENT_CASE, x)

    #undef GENERATE_ELEMENT_CASE
    #undef MYARRAY_COUNT
}
Run Code Online (Sandbox Code Playgroud)

扩展main()功能如下:

int main()
{
    int myarray[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    f(myarray[0]); f(myarray[1]); f(myarray[2]); f(myarray[3]); f(myarray[4]);
    f(myarray[5]); f(myarray[6]); f(myarray[7]); f(myarray[8]); f(myarray[9]);
}
Run Code Online (Sandbox Code Playgroud)