2011-12-30 104 views
3

我在代碼的部分宏,說C++找出一個變量是一個引用或指針

#define CATCH(doSomething)   \ 
    catch (MyException& e)    \ 
    {         \ 
     try       \ 
     {        \ 
      doSomething;    \ 
     }        \ 
    }         \ 
    catch (MyException* e)    \ 
    {         \ 
     try       \ 
     {        \ 
      doSomething;    \ 
     }        \ 
    }       

,並在DoSomething的節中,我需要去的內容一個例外,有沒有辦法做到這一點? 一些功能isPointer可以這樣使用:

try 
{ 
    THROW(new MyException()); 
} 
CATCH(        \ 
    if(isPointer(e))     \ 
    {         \ 
     std::cout << (*e).toString(); \ 
    }         \ 
    else        \ 
    {         \ 
     std::cout << e.toString();  \ 
    }         \ 
) 
+3

你可以使用模板調度 – Dani 2011-12-30 10:08:44

+4

盯着反斜槓的線條會產生一個奇怪的錯覺......無論如何,只要確保總是拋出一個堆棧,你可能會更好,分配價值並通過參考收集。在這裏使用'new'沒有任何好處;通過引用捕獲可以獲得多態行爲。 – 2011-12-30 10:11:14

+0

在C++ 11中,您可以使用類型特徵來檢查這一點。請參閱http://en.cppreference.com/w/cpp/types。還要記住,在捕捉指針時,請記得'刪除'它! – 2011-12-30 10:20:31

回答

10

只需使用重載可能取消引用的說法:

template<class T> 
T& deref(T* p) { return *p; } 

template<class T> 
T& deref(T& r) { return r; } 

,並使用:

CATCH(        \ 
    std::cout << deref(e).toString(); \ 
) 

雖然我有承認我看到沒有動態分配外部理由在物體上。

+2

+1。 – Blazes 2011-12-30 10:18:05

+0

爲什麼這些「\」?即使你不使用它們,它也可以工作,C++在代碼中跳過ws :) – 2011-12-30 11:38:46

+0

@ Mr.Anubis:那些是原始宏的一部分。 – Xeo 2011-12-30 12:05:43

相關問題