2014-11-23 23 views
1

我使用muParser來解析數學表達式,並且我想爲解析器添加一個函數,該解析器的實現將由一個類的非靜態成員函數提供。這從an example program摘錄應該給什麼,我想要做的一個想法:我可以傳遞一個成員函數到mu :: Parser :: DefineFun()嗎?

struct MyClass { // some boilerplate omitted 
    double make_a_value(double a, double b); // implemented elsewhere 
}; 

int main(const int argc, const char** argv) { 
    MyClass instance; 
    mu::Parser p; 
    p.DefineFun("f", MORE_MAGIC(MyClass::make_a_value, &instance)); 
    p.SetExpr("f(3, 2)"); 
    std::cout << p.Eval() << std::endl; 
} 

其中MORE_MAGIC(...)代表的東西與簽名double f(double arg1, double arg2)這相當於調用instance->make_a_value(arg1, arg2)。我不知道MORE_MAGIC應該是爲了這個工作。這是我的問題的本質。

DefineFun第二個參數可以具有任何以下函數簽名:

  • double f()
  • double f(double)
  • double f(double, double)
  • 等多達10個double參數
  • double f(double*, int)其中第一個指針是一個數組,它的int長度
  • double f(const char*)
  • double f(const char*, double)
  • double f(const char*, double)

不幸的是沒有這些包括,我可以使用在一個實例傳遞一個void*數據參數。我想到了顛覆double*來傳遞實例,但問題在於,muParser並不讓我預先定義要傳遞給函數的值;只有從解析的表達式獲取的參數纔會被傳遞。

從閱讀其他幾個職位(12345)筆看來,我需要的是一個綁定的功能,並做到這一點的首選方法(在C++ 98)爲boost::bind。但是我試着boost::bind(&wrapper, _1, _2, &instance)更換MORE_MAGIC(...),與

double wrapper(double a, double b, MyClass* p) { 
    return p->make_a_value(a, b); 
} 

(希望正確的語法),我得到編譯器錯誤:

/usr/include/muParserBase.h:134:95: error: no matching function for call to ‘mu::ParserCallback::ParserCallback(boost::_bi::bind_t<double, double (*)(double, double, MyClass*), boost::_bi::list3<boost::arg<1>, boost::arg<2>, boost::_bi::value<MyClass*> > >&, bool&)’ 
     AddCallback(a_strName, ParserCallback(a_pFun, a_bAllowOpt), m_FunDef, ValidNameChars()); 

等。伊克。

我想這個問題是boost::bind返回boost::function,而我需要一個標準功能,並根據this answer它或多或少不可能獲得從boost::function的標準功能沒有一些void*藏匿的實例的指針。但我不確定我是否理解正確,對Boost有一點經驗,所以我的初步問題是:誰能確認boost::bind簡單地不會做我需要它做什麼?

而我的主要問題:是否有任何的方式來完成這一切?即使它涉及C++魔法的奧祕祕密? (或* gasp *切換到C++ 11?)

回答

3

看起來像muParser API遺憾的是沒有準備好C++。在C++ 11中,Lambda可以「衰減」函數指針,但這意味着它們必須是無狀態的,所以,你又回到了同一個位置:你不能綁定額外的參數。

muParser是開源的嗎?也許有一個已經修正這一設計缺陷


哦,是的,boost::bind不能 打破物理定律 做到這一點的叉你

+0

是的,它是開源的,也有夫婦叉我知道,所以我會看看,看看他們是否可以做到這一點。如果沒有,也許我應該自己添加該功能。 – 2014-11-23 14:50:04

+0

是的,這是一個非常明顯的設計缺陷,無論如何,就在這個全面的列表https://gist.github.com/rmartinho/3176551(mmm。實際上,這不在列表中。也許有一個單獨的C API的。 ..?) – sehe 2014-11-23 16:26:28

+0

[this](https://code.google.com/p/muparser/issues/detail?id=10)是否意味着muParser開發人員拒絕爲此問題提供幫助? – crayzeewulf 2015-09-04 22:14:09

相關問題