2014-06-12 70 views
0

我正在用提升精神編寫一個簡單的計算器。執行部門操作員

我希望劃分運算符在遇到零分母時拋出異常。

我沿着

term = 
    factor      [qi::_val = qi::_1] 
    >> *(('*' >> factor   [qi::_val *= qi::_1]) 
    | 
     ('/' >> factor 
     [qi::_val = boost::phoenix::if_else(
      qi::_1, 
      qi::_val/qi::_1, 
      /*ToDo some exception actor here*/) 
     ])... 

但是線條的思維,這是有道理的,除了演員不僅要懶擲「除數爲零」,但它也必須有一個隱含的返回類型與qi::_val兼容。這就是我卡住的地方。在這裏我可以使用phoenix中的某些東西,還是需要綁定到手動編碼的函數?

回答

3

Boost Phoenix允許您通過聲明。圓括號用來做到這一點。這與boost::phoenix::throw_一起讓你寫

(boost::phoenix::throw_("division by zero"), qi::_1)

ToDo塊。 qi::_1將不會被評估,但(i)你知道它將評估爲0,因爲它將「失敗」if_else和(ii)它具有正確的類型。

+0

謝謝Batsheba。你和sehe似乎擅長這個東西。我發現助推文檔很難閱讀。 –