避免使用容器来调用函数列表?

时间:2012-07-24 12:22:28

标签: c++ function-pointers

我有一个返回bools的函数列表。我想遍历函数列表并为每个函数编写一条消息"测试1通过","测试2失败"等

我目前的解决方案是创建一个函数指针向量,推回每个函数,然后遍历向量。代码如下。有没有办法避免容器而不重复每个测试的通用消息(通过/失败)代码(想象会有数百个测试)。感觉好像向量是不必要的,或者必须有一个更优雅的解决方案。

typedef bool (*Tests)();
std::vector<Tests> tests;
tests.push_back(FASTA_FILE_READER_TEST);
tests.push_back(EXACT_MATCH_TEST);

for (int i = 0; i < tests.size(); i++) {
    std::cout   << "Test " << i + 1 
                << (tests[i]() ? " PASSED" : " FAILED")
                << std::endl;
}

4 个答案:

答案 0 :(得分:3)

有没有什么能阻止你使用数组?

#include <iostream>

bool FASTA_FILE_READER_TEST() { return false; }
bool EXACT_MATCH_TEST() { return false; }

int main()
{
    typedef bool (*Tests)();

    Tests tests[] = {FASTA_FILE_READER_TEST, EXACT_MATCH_TEST};


    for (int i = 0; i < sizeof(tests)/sizeof(Tests); i++) {
        std::cout   << "Test " << i + 1 
                    << (tests[i]() ? " PASSED" : " FAILED")
                    << std::endl;
    }    
}

答案 1 :(得分:2)

你可以用一个函数来做到这一点:

template<typename Functor>
void test(Functor& functor){
    static int i = 0;

    bool ret = functor();
    if(ret){
        std::cout << "Test " << i++ << " passed" << std::endl;
    } else {
        std::cout << "Test " << i++ << " failed" << std::endl;
    }
}

void main(){
   test(FASTA_FILE_READER_TEST);
   test(EXACT_MATCH_TEST);
}

答案 2 :(得分:2)

如果您可以使用C ++ 11功能:

#include <array>
#include <iterator>
#include <algorithm>
#include <iostream>

typedef bool (*Test)();

std::array<Test, 2> tests {{ FASTA_FILE_READER_TEST, EXACT_MATCH_TEST }};

void TestAll()
{
    size_t i = 1;
    std::for_each(std::begin(tests), std::end(tests),
         [&i](Test& t)
         {
             std::cout << "Test " << i++ << (t() ? " PASSED" : " FAILED") << std::endl; 
         });
}

Demo.

这是另一种做你已经拥有的方式(你的方式很好,IMO)。如果向量可能留下的额外容量会让您感到困扰,那么当您完成推回时,可以在其上调用shrink_to_fit()

答案 3 :(得分:0)

为每个测试创建一个类。然后是每个类的一个静态实例。 类的构造运行测试。

这当然可能会导致问题,因为测试是在调用main()函数之前执行的。