2011-12-30 56 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

相关问题