0

私は一連のシステムテストを実装する抽象基本クラスを使用しています。簡略化された形式では、クラス宣言は次のとおりです。

class Test_Class
{
    Test_Class();
    ~Test_Class();

    Run_Test(void * param_set = NULL) = 0;
}

基本クラスには、Run_Test関数の実装が必要です。これにより、ユーザーは任意のデータ構造をvoidポインターとして渡し、子クラスのRun_Testの本体内の適切な型にキャストして、さまざまなテストで使用できるようになります。さまざまなデータ構造。たとえば、あるテストのfloatと別のテストのintのリスト。

これは面倒で、信じられないほどCのようなやり方のようです。継承または他の言語ユーティリティを使用するより良い方法はありますか?

注:お客様の制約により、このプログラムはSTLまたはBoostライブラリへのアクセスを許可されていません。

4

3 に答える 3

1

一連のテストが必要な場合は、を使用std::vector<std::function<void()>> tests;してくださいtests.push_back([=] { do_test(the_args, I_captured, from_local, scope); });

std::bindコンパイラがラムダをサポートしていない場合は、同様のトリックを実行できます。

エンドユーザーであるあなたが独自のジェネリック関数インターフェースを作成する必要はありません。すでに行われています。

編集:はい、A)BoostまたはSTLによって提供されるホイールを再実装するか、B)BoostまたはSTLによって提供される既存のホイールを使用しないと、Cスタイルのゴミが発生することになります。「自分の良いコードを書く」と「他の人の良いコードを使う」の間に魔法のような第3の選択肢はありませんが、それでも良いコードが得られます。

于 2012-05-15T22:23:47.610 に答える
1

はい。ユーザーは任意のデータ構造を渡すことはありませんが、基本クラスを拡張することで任意のデータ構造を作成できます。

class Test_Class {
    Run_Test(const Config& config);
};

クライアントコード:

class MyConfig : public Config {
    //...
};

もう1つのオプションはテンプレートです。あなたはどちらかで多くの一般的なタスクを達成することができます、私はこの状況でどれが理想的かわからないので、他の答えに任せるか、あなたがこのルートに行くならそれを研究するためにあなたに任せます。

于 2012-05-15T22:24:56.323 に答える
0

クラス内の関数の引数検出を行うことが可能/方法であるかどうかを覚えていないので、おそらくこれでうまくいくでしょう:

class Test_Class {

public:
  template <typename T>
  void Run_Test(T p) { 

  }
};

template <class T>
void tester(Test_Class t, T p) {
t.Run_Test<T>(p);
}

int main() {
  Test_Class p;
  int a = 5;

  tester(p, a);
}
于 2012-05-15T22:51:30.410 に答える