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

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 に答える
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 に答える
0

テストごとにクラスを作成します。次に、各クラスの 1 つの静的インスタンス。クラスのコンストラクターはテストを実行します。

main() 関数が呼び出される前にテストが実行されるため、これはもちろん問題を引き起こす可能性があります。

于 2012-07-24T12:31:21.050 に答える