-2

C++ の単体テストに役立つマクロを作成したいと考えています。テスト目的だけで新しいオブジェクトを作成したくない場合。(ClassName::function) のようなクラス関数参照を渡すことは可能ですか?

#define TEST(func_ptr,X,Expercted) \
(__extension__ ( \
{ \
  __typeof__(X) __x = (X); \
  __typeof__(Expercted) __y = (Expercted); \
  result= funct_ptr(__x);\
  //------- do some testing stuffs-----\
 } \
))

クラス A とそのメソッド square() があります

int main(){
  TEST(&A::square,2,4);
  return 0;
 }

square 関数が真の値を返すかどうかをテストしたいと思います。

上記のコードはエラーになります。問題を解決する方法。他の方法での解決策はかなりのものです

4

2 に答える 2

2

クラスインスタンスを呼び出す必要がある非静的メンバー関数 pointerを渡しています。それをstatic member または free functionに変更すると、問題なく動作するはずです。

class A{
    ...
    static bool square(...);
};

TEST(A::square,...);

また

bool square(...);

TEST(square,...);

また、マクロにタイプミスがあります- func_ptr vs funct_ptr

于 2013-02-07T05:37:04.750 に答える
2

標準によれば、オブジェクトを作成せずに非静的メンバー関数を呼び出すことはできません。そのため、 (例: ) のオブジェクトを作成し、次のように呼び出す必要があります。AA a

A a;
TEST( std::bind( &A::square, &a ), 2, 4 );

そのような目的でマクロスを使用するのは良い考えかどうか尋ねられたら、私はあなたに答えます-いいえ。代わりに関数を記述してください。このような

template< class F, class Ex >
bool test( F f, Ex expected ) {
    Ex res = f();
    return res == expected;
}
...
assert( test( std::bind( &A::square, &a, 2 ), 4 ) );
于 2013-02-07T05:37:38.877 に答える