[英]C++ function pointer syntax
我知道通常,函數指針聲明如下:
void __stdcall my_func(int i) {} // for assigning
void (__stdcall * my_ptr)(int) = &my_func;
現在我有幾個函數將函數指針作為它們的參數:
void calling_func(void (__stdcall * callback)(int)) { *callback(1); }
在頭文件中,我剛剛刪除了該東西的名稱:
void calling_func(void (__stdcall *)(int));
和voilá,有用......讓我思考:如果那是一個完整的類型聲明,那么對於函數指針也不能使用普通的TYPE NAME = VALUE
語法嗎?
我試圖宣布:
( void (__stdcall *)(int) ) callback = &my_func;
它也編譯! 為什么不經常使用這個? 這種符號有缺陷嗎? 對我而言,它似乎會大大簡化函數指針的使用......也可以在typedef中使用,例如:通常它是typedef OLDNAME NEWNAME
,只是使用函數指針,這是一種奇怪的由內而外的語法,其中新名稱實際上在中間整個表達。 更不用說返回函數指針的函數的符號了......
不為我編譯。 AFAIK它不是有效的C ++。
不過你可以偽造它!
template <typename T>
struct identity {
typedef T type;
};
identity<void(*)(int)>::type callback = &my_func;
或者使用boost::function
(或std::function
)之類的東西來獲得終極勝利。
這不是一個聲明,它是一個callback
演員,然后分配給。
您確定您的范圍內沒有預先存在的聲明嗎?
我更喜歡使用typedef
我的函數指針,並且還沒有遇到問題。
如果我理解正確的話,Typedef不會將新類型作為另一個的別名(這就是為什么size_t
和unsigned int
可以互換使用而不需要編譯器投訴)。 因此,對於經常使用的函數指針類型,typedef使它們更容易使用。
對於函數指針typedef,語法為:
typedef IObject * (*CreateFunc )(int, Core *);
在內部使用所需的類型名稱(與您現在正在進行的操作沒有太大區別)。 您可以指定大多數函數修飾符(__stdcall,__ declspec等),它們只是在* name
之前的括號內。
您可以非常輕松地調用,分配和獲取這些值,並將它們轉換為void *
以便傳遞(當類型未知時)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.