2013-02-07 79 views
-2

我想創建一個宏,它有助於單元測試C++。我不想爲測試目的創建一個新的對象。 是否可以傳遞類函數引用,如(ClassName :: function)?如何在C++中傳遞類函數(ClassName :: function)引用MACRO

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

我有一類A及其方法平方()

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

我要測試的平方函數是否返回真值。

上面的代碼給出了錯誤。如何解決問題。其他方式的解決方案是可觀的

+0

什麼是錯誤? – Raptor

回答

2

您正在傳遞一個非靜態成員函數指針,它需要調用一個類實例。如果您將更改爲靜態成員或免費函數,它應該可以正常工作。

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

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

bool square(...); 

TEST(square,...); 

而且宏有一個錯字 - func_ptr VS funct_ptr

+0

它給出了一個錯誤 'funct_ptr'未在此範圍內聲明 –

+0

@sayemsiam再次看看您的宏定義,有一個錯字導致問題.. –

+0

這是一個錯字,謝謝@Karthik T –

2

根據標準不能調用非靜態成員函數,而無需創建一個對象。這就是爲什麼你應該創建一個對象的A(爲前。A a),並調用這樣

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

如果你會問,如果它是一個不錯的主意,用macroses爲目的的那樣,我會告訴你 - 沒有。改寫一個函數。像這樣

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)); 
+0

它給出了一個錯誤'bind':不是'std'的成員 –

+0

你使用什麼編譯器?它的版本是什麼? – borisbn

+0

Visual Studio 2010 –

相關問題