嵌套循环展开

时间:2015-11-22 11:27:31

标签: c++ templates

鉴于我有一个功能

double doSomething(int const a, int const b, int const c) { /*...*/}

我想为不同的输入a,b和c测试这个函数。然后,我可以给出一个包含可能参数的列表,并用三个循环测试所有组合:

int aTest[] = {1,2,3,4}
int bTest[] = {-5,-3,0}
int cTest[] = {2,65,8,0,-100}
for (unsigned int i = 0; i < 4; ++i) {
    for (unsigned int j = 0; j < 3; ++j) {
        for (unsinged int k = 0; k < 5; ++k) {
            double val = doSomething(aTest[i], bTest[j], cTest[k]);
            //Compare results etc.
        }
    }
}

编译器希望足够智能在编译时展开这些循环,以便生成类似的东西:

doSomething(1,-5,2);
doSomething(1,-5,65);
doSomething(1,-5,8);
//...

但是,鉴于我的编译器不够智能,无法进行展开,我将如何处理模板?

1 个答案:

答案 0 :(得分:1)

您可以尝试这样做:

double TestData[] = { 1.5, 2.7, 3.6, 4.5, 7.9 };

template<int K>
class Super {
public:
    inline static void Do()
    {
        Super<K - 1>::Do();
        double val = doSomething( TestData[K] );
    }
};

template<>
class Super<0> {
public:
    inline static void Do()
    {
        double val = doSomething( TestData[0] );
    }
};