2010-07-02 89 views
7

我想聲明C++中的成員函數的指針,即返回相同的成員函數的指針類型它返回相同類型的成員函數的指針的

成員函數指針這不起作用:

class MyClass { 
public: 
     typedef FunctionPtr (MyClass::*FunctionPtr)(); 
} 

有人知道解決方案嗎?

+0

我很想說使用'mem_fun_ref',但我看不出。很好的問題。 – wheaties 2010-07-02 20:27:23

+1

不再...爲什麼大家都想這樣做?我從來沒有需要任何東西,甚至接近這一點。 – 2010-07-02 22:00:52

+0

@大衛:我跟你在一起。我記得在C++編程15年中使用成員指針_once_。 – sbi 2010-07-02 22:17:59

回答

5

沒有辦法做到這一點。實際上,成員函數在這裏沒有任何區別:沒有辦法聲明一個返回指向它自己的函數類型的指針的普通函數。該聲明將是無限遞歸的。

在普通功能的情況下,您可以使用void (*)()類型作爲「通用」函數指針類型(就像void *通常用於數據類型一樣)。對於成員函數指針將是void (A::*)()類型。儘管如此,你必須使用reinterpret_cast。但是,此用法(往返轉換)恰好是定義reinterpret_cast的行爲時的用法。

當然,你將被迫使用強制轉換指針和該類型的指針。 AFAIK,有優雅的基於模板的解決方案,有一箇中間臨時模板對象來執行投射。你可能也想看看這個GotW entry

P.S.請注意,使用void *類型作爲函數指針的中間類型被該語言禁止。儘管這種非法使用似乎與普通函數指針「工作」,但它完全沒有機會使用成員函數指針。成員函數指針通常是非平凡對象,其大小大於void *指針的大小。

0

你試圖做的事情是不可能的 - 函數的返回類型是函數本身的類型,它還不知道,所以它會導致無限循環。

5

AndreyT引用了最好的答案在GotW #57,所以我還不如在這裏複製它:

class MyClass { 
public: 
     struct FunctionPtrProxy; 
     typedef FunctionPtrProxy (MyClass::*FunctionPtr)(); 

     struct FunctionPtrProxy 
     { 
       FunctionPtrProxy(FunctionPtr pp) : p(pp) { } 
       operator FunctionPtr() { return p; } 
       FunctionPtr p; 
     } 

} 
+2

有趣的是,如此多的「這是不可能的」答案已經消失... – Beta 2010-07-03 00:12:28

+0

我能夠在GoW#57上得到這個例子來工作。但是,如果我添加一個成員函數上面的類,只是返回本身無法編譯(gcc錯誤:參數的類型'MyClass :: FunctionPtrProxy(MyClass ::)()'不匹配'MyClass :: FunctionPtrProxy')。 @MSN你可以給你一個上面的例子,你有一個成員函數返回自己,它編譯的地方,謝謝:) – 2012-05-11 21:48:16

相關問題