- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 muParser解析数学表达式,我想向解析器添加一个函数,其实现将由类的非静态成员函数提供。此节选自an example program应该给出我想做什么的想法:
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
的第二个参数可以有以下任何函数签名:
双 f()
双 f(double)
double f(double, double)
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)看来,我需要的是一个绑定(bind)函数,以及实现它的首选方法(在 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如果没有一些 void*
来存储实例指针,从 boost::function
获取标准函数或多或少是不可能的。但我不确定我是否理解正确,对 Boost 没有什么经验,所以我的初步问题是:任何人都可以确认 boost::bind
只是不会做我需要它做什么?
我的主要问题是:是否有任何方法来实现这一目标?即使它涉及 C++ 巫术的神秘 secret ? (或者 *gasp* 切换到 C++11?)
最佳答案
很遗憾,muParser API 似乎还没有为 C++ 做好准备。
在 C++11 中,Lambda 可以“退化”为函数指针,但这意味着它们必须是无状态的,所以,你又回到了同一个地方:你不能绑定(bind)额外的参数。
muParser 是开源的吗?或许有一个 fork 已经修正了这个设计缺陷
哦,是的,boost::bind
不能
打破物理定律
为您做这件事
关于c++ - 我可以将成员函数传递给 mu::Parser::DefineFun() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27088272/
这让我难住了。你如何为 newtype Mu f = InF {outF :: f (Mu f)} 编写一个 Functor 实例 最佳答案 你不能。为了为某些 Functor c 定义一个实例 c
我按照这个答案访问了Sans-serif math with latex in matplotlib让我的 matplotlib 使用 Computer Modern Sans。效果非常好,只是我无法
.book-summary ol { counter-reset: item ; } .book-summary ol li { margin-left:10px; margin-top:
在 recursion-schemes 包定义了以下类型: newtype Fix f = Fix (f (Fix f)) newtype Mu f = Mu (forall a. (f a -> a
我正在尝试为 Wordpress MU 站点设置本地环境。 当我尝试使用默认的 apache/mysql 端口时。我收到错误 Error establishing database connectio
我在 wordpress 重定向中的重定向导致域更改时遇到了一些问题。 例子:网站 - noncdn.somedomain.comCDN 网址 - www.domain.com 当我打开没有尾部斜杠的
我正在尝试在我的 .htaccess 文件中编写规则,以在我的 Wordpress MU 网络中使用 www.mainsite.com 默认为 HTTPS://。对于所有其他子域,是否可以添加通配符
我正在使用 muParser解析数学表达式,我想向解析器添加一个函数,其实现将由类的非静态成员函数提供。此节选自an example program应该给出我想做什么的想法: struct MyCla
这很难解释,但基本上如果我按 3,它适用于我的所有外壳部件(开关)。我如何让值(value)每次都是新的。例如,如果我按 3,则会打印以下内容: Pasirinkite objekta ir jo m
我尝试编写 R 代码来查找 mu s.t. 的值。正态分布满足概率 P(N(mu, 1)>1.96)=0.95 (即 P(Z>1.96)=0.95 其中 Z~ N(mu, 1) 和 mu 是我想要得到
在服务总线基本版和标准版中,成本部分取决于操作数量。在服务总线高级层中,1 MU 每月可以处理多少次操作? 最佳答案 似乎没有一个明确的答案。借助 Service Bus Premium,每个 1 消
在服务总线基本版和标准版中,成本部分取决于操作数量。在服务总线高级层中,1 MU 每月可以处理多少次操作? 最佳答案 似乎没有一个明确的答案。借助 Service Bus Premium,每个 1 消
阅读后Milewski's F-algebra article ,我尝试实现它并用于解决现实世界的问题。但是,我似乎不知道如何为 Fix 编写实例, newtype Fix f = Fx { unFi
我正在尝试使用 NAudio 将 mu-law 编码音频解码为 pcm 音频。我的服务已发布原始 mu-law 编码音频字节,但我从 NAudio 收到错误,表明数据没有 RIFF header 。我
R 有一个 negative binomial function可以使用 mu 而不是概率(例如, float >= 0 和 <=1)进行参数化。我正在尝试复制此分布: rnbinom(1000,si
当我进行分析时,我可以看到一些带有 ms(毫秒)的数据,但我也看到了 μs。 JProfiler中的μs是什么意思? 最佳答案 表示微秒,即毫秒的 1/1000(1000 μs = 1 ms)。希腊字
我在安装 Wordpress 4.7 时使用 Loco Translate 翻译插件。 我的 MU-Plugin 已正确注册并正确配置以加载其文本域。 但 Loco Translate 只能识别主题和
我已将训练数据矩阵转换为 z-scores对于每一列。我对 zscore 的输出中的每一列都有 mu 和 sigma . 我还有另一个矩阵(我的测试数据),我想使用获得的 mu 和 sigma 将其转
我偶然发现了以下奇怪的情况: >>> class Test: µ = 'foo' >>> Test.µ 'foo' >>> getattr(Test, 'µ') Traceback (
我偶然发现了以下奇怪的情况: >>> class Test: µ = 'foo' >>> Test.µ 'foo' >>> getattr(Test, 'µ') Traceback (
我是一名优秀的程序员,十分优秀!