如何在c ++ MACRO中传递类函数(ClassName :: function)引用

时间:2013-02-07 05:30:18

标签: c++ unit-testing macros

我想创建一个有助于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函数是否返回true值。

以上代码会出错。如何解决问题。其他方面的解决方案值得注意

2 个答案:

答案 0 :(得分:2)

您正在传递一个非静态成员函数指针,这需要一个类实例来调用。如果将其更改为静态成员或免费功能,则应该可以正常工作。

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

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

bool square(...);

TEST(square,...);

你的宏也有一个错字 - func_ptr vs funct_ptr

答案 1 :(得分:2)

根据标准,如果不创建对象,则无法调用非静态成员函数。这就是为什么你应该创建A对象(对于例如A 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 ) );