這可能嗎?是否可以在C++中聲明指向模板函數的void指針?
如果我已經理解是正確的,void指針可以指向任何類型。因此,模板函數(未聲明類型)是可能的?或void指針只能保留爲「變量」不起作用?那麼void函數指針呢?
這可能嗎?是否可以在C++中聲明指向模板函數的void指針?
如果我已經理解是正確的,void指針可以指向任何類型。因此,模板函數(未聲明類型)是可能的?或void指針只能保留爲「變量」不起作用?那麼void函數指針呢?
您可以將任何函數指針類型轉換爲任何其他函數指針類型,但在調用它之前,最好將其轉換爲正確的類型。因此,您可以使用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
根據標準,一個void *是不能夠保持一個函數指針需要。 (它需要是來保存指向任何類型數據的指針)。然而,你現在可能會看到的大多數cpu架構都有數據指針&函數指針,它們的大小相同。
這裏有一個問題,因爲我害怕的話。
有指針和函數指針之間的區別,最明顯的是,他們不必是相同的尺寸。
因此,使用void*
類型來保存函數指針的地址是未定義的行爲。
一般來說,在C++中使用void*
並不是一個好主意。這些對於C來說是必要的,因爲缺乏適當的類型系統,但是C++類型系統更加發展(儘管不像最近的語言那樣發展)。
你可能會從這裏的一些客觀事物中受益。如果你讓你的方法成爲一個類的實例(模板),你可以從一個公共基類派生這個類。這很常見,這些對象被稱爲Functors。
但是,如果沒有您的問題的確切描述,將很難提供更多幫助。
與你需要一些掛羊頭賣狗肉的模板做到這一點,否則編譯器不能消除歧義的功能(這實在是不推薦的,其可怕的閱讀,並可能違反了幾千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++風格的'安全'鑄造不會允許這樣)