2010-07-15 92 views

回答

1

您可以將任何函數指針類型轉換爲任何其他函數指針類型,但在調用它之前,最好將其轉換爲正確的類型。因此,您可以使用void(*)()作爲等效於void*的函數指針。這也適用於功能模板。

template<typename T> 
void f(T){} 

typedef void(*voidfp)(); 

voidfp fp=static_cast<voidfp>(&f<int>); // store address of f(int) in variable 
static_cast<void(*)(int)>(fp)(3); // call the function 

fp=static_cast<voidfp>(&f<std::string>); // store address of f(std::string) in variable 
static_cast<void(*)(std::string)>(fp)("hello"); // call the function 
0

根據標準,一個void *是能夠保持一個函數指針需要。 (它需要來保存指向任何類型數據的指針)。然而,你現在可能會看到的大多數cpu架構都有數據指針&函數指針,它們的大小相同。

0

這裏有一個問題,因爲我害怕的話。

指針函數指針之間的區別,最明顯的是,他們不必是相同的尺寸。

因此,使用void*類型來保存函數指針的地址是未定義的行爲。

一般來說,在C++中使用void*並不是一個好主意。這些對於C來說是必要的,因爲缺乏適當的類型系統,但是C++類型系統更加發展(儘管不像最近的語言那樣發展)。

你可能會從這裏的一些客觀事物中受益。如果你讓你的方法成爲一個類的實例(模板),你可以從一個公共基類派生這個類。這很常見,這些對象被稱爲Functors。

但是,如果沒有您的問題的確切描述,將很難提供更多幫助。

0

與你需要一些掛羊頭賣狗肉的模板做到這一點,否則編譯器不能消除歧義的功能(這實在是不推薦的,其可怕的閱讀,並可能違反了幾千porgamming最佳實踐)

IE:此不工作(ATLEAST下VS08 & GCC 3.5):

template <typename tType> tType* GetNULLType() 
{ 
    return static_cast<tType*>(0); 
} 

void* pf = static_cast<void*>(GetNULLType<int>); 

你,而不是需要做的:

template <typename tType> tType* GetNULLType() 
{ 
    return static_cast<tType*>(0); 
} 

typedef int* (*t_pointer)(); 
t_pointer pfGetNull = GetNULLType<int>; 
void* pfVoid = (void*)(pfGetNull); 

(一d純粹主義者呻吟之前,似乎C++風格的'安全'鑄造不會允許這樣)