1

我有一个返回布尔值的函数列表。我想遍历函数列表并为每个“测试 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

4 回答 4

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;
    }    
}
于 2012-07-24T12:28:14.507 回答
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);
}
于 2012-07-24T12:29:28.573 回答
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; 
         });
}

演示。

这是做你已经拥有的另一种方式(而且你的方式很好,IMO)。如果向量可能留出的额外容量让您感到困扰,您可以在完成推回后对其调用shrink_to_fit() 。

于 2012-07-24T12:40:55.380 回答
0

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

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

于 2012-07-24T12:31:21.050 回答