我使用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並不讓我預先定義要傳遞給函數的值;只有從解析的表達式獲取的參數纔會被傳遞。
從閱讀其他幾個職位(1,2,3,4,5)筆看來,我需要的是一個綁定的功能,並做到這一點的首選方法(在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?)
是的,它是開源的,也有夫婦叉我知道,所以我會看看,看看他們是否可以做到這一點。如果沒有,也許我應該自己添加該功能。 – 2014-11-23 14:50:04
是的,這是一個非常明顯的設計缺陷,無論如何,就在這個全面的列表https://gist.github.com/rmartinho/3176551(mmm。實際上,這不在列表中。也許有一個單獨的C API的。 ..?) – sehe 2014-11-23 16:26:28
[this](https://code.google.com/p/muparser/issues/detail?id=10)是否意味着muParser開發人員拒絕爲此問題提供幫助? – crayzeewulf 2015-09-04 22:14:09