我有一个返回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;
}
答案 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;
});
}
这是另一种做你已经拥有的方式(你的方式很好,IMO)。如果向量可能留下的额外容量会让您感到困扰,那么当您完成推回时,可以在其上调用shrink_to_fit()。
答案 3 :(得分:0)
为每个测试创建一个类。然后是每个类的一个静态实例。 类的构造运行测试。
这当然可能会导致问题,因为测试是在调用main()函数之前执行的。