2012-06-02 47 views
4

假設我有如何獲取析構函數的成員函數指針?

struct X { 
    ~X() {} 
}; 

什麼類型,我如何獲得C++ 03的X::~X()成員函數指針?

我不想實際調用它,只是在SFINAE中用來判斷是否存在給定類型的析構函數。

+3

析構函數** **總是存在... –

+0

@OliCharlesworth:但是,作爲一個實際的功能?當我從棧中彈出一個'int'時,沒有調用int ::〜int'函數。 – bitmask

+0

@bitmask:'int'不是'class',所以它沒有_destructor_。 –

回答

5

你不能得到析構函數的指針或構造函數。儘管如此,對於某個類型總是存在析構函數,並且您無法檢測到帶有as訪問說明符的private是否不被SFINAE所考慮。

上調用這將是一個標量類型的析構函數的主體,標準說[class.dtor]/16

[注:符號的析構函數的顯式調用可以用於任何標量類型名稱(5.2.4)。允許這樣就可以編寫代碼而不必知道給定類型是否存在析構函數。例如,

typedef int I;

I * p;

p-> I ::〜I();

就要收注]

+0

謝謝。我的動機是,如果我不調用某些對象的析構函數,我可以加速數據結構的特定部分。所以我試圖決定是否有一個不平凡的析構函數。任何線索? – bitmask

+0

@bitmask:因爲你的問題是關於_C++ 03_的,所以最好的辦法就是'boost :: has_trivial_destructor'類型特徵,只有編譯器提供了合適的內在特徵時才適用。但是如果一個析構函數是微不足道的,我仍然會調用它,讓編譯器優化它... –

+0

嗯,我必須忍受一個殘缺的C++子集,因爲我沒有提升,也沒有C++ 11。我不必摧毀一個對象,而是一堆對象,但如果它們很瑣碎,就不必做任何事情,所以我不希望迭代被優化掉,所以我想把它燒成代碼。 – bitmask