2012-11-08 217 views
11

我想寫一個模板,它將得到一個參數作爲實例化函數的返回類型。有沒有什麼辦法可以獲得「當前函數」的返回類型

例如,假設我有一個Result模板類:

template<type T> 
class Result { 
    T _result_value; 
    T& operator=(T that); 
    ~Result(); 
} 

會有這一類的幾個專業。在析構函數中,我想記錄返回類型,並且在operator=任務中,我想檢查並確定錯誤值。

理想情況下,我希望能夠有這樣的定義:

#define RESULT Result< /* decltype magic for type of current function */ > 

,所以我可以使用它:

HFILE MyOpenFile(...) { 
    RESULT result; 
} 

...將被推斷爲Result<HFILE>。這是一個簡化的例子:編寫RESULT而不是Result<HFILE>不是什麼大問題,但還有其他場景,其中當前函數的返回類型不容易獲得。

+0

,你可以使用http://en.wikipedia.org/wiki/Decltype? – bobah

+1

我想你至少必須將函數名稱傳遞給宏(例如'RESULT(MyOpenFile)'),並且在重載的情況下,你仍然會遇到不明確的地方。即使[獲取指向當前函數的指針](http://stackoverflow.com/q/2154852/1468366)也很棘手,如果不重新命名該函數,則獲得正確類型的指針似乎是不可能的。 – MvG

+0

@MvG,你可以通過傳遞給'decltype'函數+ params來解決超載模糊問題。 'decltype(foo(b))','decltype(foo(a,b))'將正確解析。然而,這是一種痛苦。 – Nim

回答

4

沒有.C++中沒有涉及「當前函數」的東西。最接近的是__func__但這是一個字符串文字。因此,沒有什麼可以傳遞給decltype

不是你需要它,與auto

3

從函數內部是不可能的,因爲在內存中沒有代表它的專用對象可以被引用來推斷類型。課程可以通過decltype(*this)進行。

3

最簡便的方式我能想到的是使用decltype的:

#define RESULT(func, ...) Result<decltype(func(__VA_ARGS__))> 

int main(int argc, char **argv) { 
    RESULT(main, argc, argv) result; // same as `Result<int> result;` 
} 

但是,這迫使你傳遞函數名和每一個需要的RESULT宏參數。我不認爲這是可以避免的,因爲沒有可移植的(通常甚至沒有編譯器特定的)方法來獲得當前函數和/或參數傳遞的標識符。由於超載歧義,參數通過了事情。

這裏是一個SSCCE:http://ideone.com/cPTjjF

+2

您不需要可變參數業務,只需將'RESULT'定義爲'RESULT(f)結果',然後用作'RESULT(main(argc,argv))'... – Nim

相關問題