相关疑难解决方法(0)

处理框架以从脚本调用不同类型的函数的C++方法是什么?

我尝试了不同的方法,并在这里询问了有关我的要求的子问题的几个具体问题.但是我的解决方案并没有像预期的那样真正起作用,所以我退后一步,从更广泛的角度来问这里.请记住,我不是C++专业人士.也不是初学者,但我还在学习语言.

所以,我有以下要求.我需要读入包含条件的文本文件,例如"Greater"或"Equals",所有这些函数都返回布尔值.文本文件还包括这些条件的参数.注意,这些参数可以是不同类型(整数,小数等),并且每个这样的条件可以采用不同数量的参数(例如,"等于"需要2个参数,而"之间"将采用3个参数).因此该文件可能如下所示:

Greater, 2, 3
Greater, 2.4, 1.0
Equals, true, true
Between, 20, 10, 30
Run Code Online (Sandbox Code Playgroud)

读入该文件并解析它的逻辑已经完成.现在我需要将所有这些布尔函数与其参数"连接"并检查它们是否都为真.

所以我想我会用静态方法创建函数或类来表示这些布尔测试函数,然后创建一个函数指针映射到这些函数,由它们的名称映射.在运行时,我会读入文件,调用相应的函数指针并传入paramteres.这对我来说似乎很容易,但实际上我很挣扎的事实是这些布尔函数可以采用不同数量的参数,并且这些参数可以是不同类型的.

你能推荐一种方法来解决C++中的这个问题吗?我不是要求一个完整的解决方案,但是对于一个合适的C++方法,或者我可以遵循的指南.提前致谢!

evaluation parsing expression variant c++11

5
推荐指数
1
解决办法
252
查看次数

如何使用boost :: spirit验证代数语句?

我正在尝试扩展计算器示例,以便解析器将确定代数语句是否为真,而不是解析和评估代数表达式.我的意思是1 + 5 * 5 - 10 = 19 - 3(期望的解析器结果是true)和3 - 1 = 9(期望的解析器结果false).

我必须承认我是新手,boost::spirit而且现在这一切都是压倒性的.但是,我觉得我理解计算器示例足够好,至少可以取得一些进展.

使用提供的示例作为起点,语法如下所示:

calculator() : calculator::base_type(expression)
{
    using qi::uint_;
    using qi::_val;
    using qi::_1;

    expression =
        term                    [_val = _1]
            >> *( ('+' >> term  [_val = _val + _1])
                | ('-' >> term  [_val = _val - _1])
                );

        term =
            factor                [_val = _1]
            >> *( ('*' >> factor  [_val = _val * …
Run Code Online (Sandbox Code Playgroud)

c++ parsing boost boost-spirit boost-spirit-qi

4
推荐指数
1
解决办法
522
查看次数

如何使用boost :: spirit解析数学表达式并将其绑定到函数

我想定义一个带有2个参数的函数

 double func(double t, double x); 
Run Code Online (Sandbox Code Playgroud)

从外部文本文件中读取实际实现的位置.
例如,在文本文件中指定

function = x*t;    
Run Code Online (Sandbox Code Playgroud)

功能应该实现的乘法xt,以便它可以在稍后阶段被调用.我正在尝试使用boost :: spirit来解析函数.但我不知道如何实现它.

下面,我创建了一个实现乘法的简单函数.我将它绑定到boost函数,我可以使用它.我还创建了一个简单的语法,它解析了两个双精度数之间的乘法.

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include <boost/spirit/include/qi_symbols.hpp>
#include <iostream>
#include <string>

namespace qi = boost::spirit::qi;
namespace ascii=boost::spirit::ascii;
using boost::spirit::ascii::space;
using boost::spirit::qi::symbols;

template< typename Iterator >
struct MyGrammar : public virtual qi::grammar<  Iterator,  ascii::space_type >
{
    MyGrammar() : MyGrammar::base_type(expression)
    {
        using qi::double_;
        //The expression should take x and t as symbolic expressions
        expression = (double_ >> '*' …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-bind boost-spirit boost-function

3
推荐指数
1
解决办法
3765
查看次数