2013-03-22 39 views
0

這裏是我的問題:C++:如何得到當前函數的地址

我有這方面的函數指針向量和迭代器:

std::vector<void* (*) (void*)> f_callbackVector; 
std::vector<void* (*) (void*)>::iterator f_callbackVectorIterator = f_callbackVector.begin(); 

我填充一些功能的載體:

f_callbackVector.push_back((void* (*) (void*))handleDeliveryModeChange); 

當我在函數中,我想能夠檢查迭代器是否持有指向此當前函數的指針。我嘗試這樣做:

void handleDeliveryModeChange(SESSION s, const DELIVERY_MODE d1, const DELIVERY_MODE d2) { 
    if (static_cast<void (*) (void*, DELIVERY_MODE, DELIVERY_MODE)>((*f_callbackVectorIterator)) == &handleDeliveryModeChange) { 
    LOG_MESSAGE("\n\n\n\nWOW\n\n\n\n"); 
} 
} 

,並得到:

invalid static_cast from type âvoid* (*)(void*)â to type âvoid (*)(void*, DELIVERY_MODE, DELIVERY_MODE)â 

我將不勝感激一些幫助與此有關。

謝謝!

UPD: 我想:

if (*(f_callbackVectorIterator) == &handleDeliveryModeChange) 

,並得到了錯誤:comparison between distinct pointer types âvoid()(void)â and âvoid()(void, DELIVERY_MODE, DELIVERY_MODE)â lacks a cast

我甚至嘗試這個怪物:

if ((*f_callbackVectorIterator) == static_cast<&(void* (*) (void*))>(&handleDeliveryModeChange)) 

仍然沒有運氣,得到了很多晦澀的構造結錯誤。

回答

4

&myfunc獲取函數的地址。

+0

我嘗試使用IF((* f_callbackVectorIterator)==&handleDeliveryModeChange),並得到了錯誤:不同的指針之間的比較(*)(*)(void *,DELIVERY_MODE,DELIVERY_MODE)'缺少轉換 – user2199745 2013-03-22 15:10:36

+0

不知道f_callbackVectorIterator之前的星號在我的評論中消失的位置。它在我的代碼中。 – user2199745 2013-03-22 15:11:58

+0

,因爲你的功能簽名不匹配。 – 2013-03-22 15:14:52

1

你在撒謊編譯器:

f_callbackVector.push_back((void* (*) (void*))handleDeliveryModeChange); 

handleDeliveryModeChange不匹配此簽名。它的簽名居然是:

void (*)(SESSION, DELIVERY_MODE, DELIVERY_MODE) 

你可以把它通過改變對這項工作:Code

#include <vector> 
#include <iostream> 

typedef void* SESSION;  // Or whatever it is 
typedef void* DELIVERY_MODE; // You didn't say what these are 
typedef void* (*Func) (SESSION, DELIVERY_MODE, DELIVERY_MODE); 
typedef std::vector<Func> FuncVector; 

FuncVector f_callbackVector; 
FuncVector::iterator f_callbackVectorIterator = f_callbackVector.begin(); 

// Note: Your pointers return void*, so I changed the return type from void: 
void* handleDeliveryModeChange 
(
    SESSION s, 
    const DELIVERY_MODE d1, 
    const DELIVERY_MODE d2 
) 
{ 
    if ((*f_callbackVectorIterator) == &handleDeliveryModeChange) 
    { 
    std::cout << "\n\n\n\nWOW\n\n\n\n"; 
    } 
    return NULL; 
} 

int main() 
{ 

    f_callbackVector.push_back(handleDeliveryModeChange); 
}