C++ 现代C++;表达式树的版本https://gist.github.com/2934374

C++ 现代C++;表达式树的版本https://gist.github.com/2934374,c++,c++11,C++,C++11,因此,我对这个比较和评论中出现的可怕的C++解决方案很感兴趣,但我必须承认我自己写一个好的解决方案有困难:-) 我当前的尝试是这样的,问题是: 创建树时复制环境,我希望创建树后变量可以更改 看起来还是挺难看的 那么,我怎样才能稍微压缩它,并绑定变量,使它们受到更改的影响呢 #include <map> #include <string> #include <iostream> #include <functional> using namesp

因此,我对这个比较和评论中出现的可怕的C++解决方案很感兴趣,但我必须承认我自己写一个好的解决方案有困难:-) 我当前的尝试是这样的,问题是:

  • 创建树时复制环境,我希望创建树后变量可以更改
  • 看起来还是挺难看的
那么,我怎样才能稍微压缩它,并绑定变量,使它们受到更改的影响呢

#include <map>
#include <string>
#include <iostream>
#include <functional>
using namespace std;

/* environ */
map<string,int> variables = { { "a" , 3 }, { "b", 4 }, { "c", 5 } };

function<int(int,int)> add = [] (int lp, int rp) { return lp + rp; };
function<int(int,int)> mlt = [] (int lp, int rp) { return lp * rp; };

/* impl */
struct Var {
    Var(int v) : p_v(v) {};
    int eval() { return p_v; };

private:
    int p_v;
};

template <typename LP, typename RP>
struct Op {
    Op(function<int(int,int)> op, LP lp, RP rp) : p_op(op), p_l(lp), p_r(rp) {};
    int eval() { return p_op(p_l.eval(), p_r.eval()); }
private:
    function<int(int,int)> p_op;
    LP p_l;
    RP p_r;
};

Var var(int val) { return Var(val); }

template <typename LP, typename RP>
auto op(function<int(int,int)> op, LP lp, RP rp) -> Op<LP,RP>
{
    return Op<LP,RP>(op,lp,rp);
}

Var operator "" _var(const char *key, size_t length)
{ return Var(variables[key]); }

/* gcc is failing me
Var operator "" _num(int val)
{ return Var(val); }
*/

int main()
{
    auto tree = op ( add, "a"_var, op ( mlt, var ( 2 ), "b"_var ));
    cout << tree.eval() << endl;
}
#包括
#包括
#包括
#包括
使用名称空间std;
/*环境*/
映射变量={“a”,3},{“b”,4},{“c”,5};
函数add=[](int-lp,int-rp){return-lp+rp;};
函数mlt=[](int-lp,int-rp){return-lp*rp;};
/*恳求*/
结构变量{
Var(intv):p_v(v){};
int eval(){return p_v;};
私人:
int p_v;
};
模板
结构操作{
Op(函数Op,LP-LP,RP-RP):p_-Op(Op),p_-l(LP),p_-r(RP){};
int eval(){返回p_op(p_l.eval(),p_r.eval());}
私人:
函数p_-op;
LP p_l;
RP p_r;
};
Var-Var(int-val){返回Var(val);}
模板
自动op(功能op、LP、RP)->op
{
返回Op(Op、lp、rp);
}
变量运算符“”\u变量(常量字符*键,大小\u t长度)
{return Var(variables[key]);}
/*gcc让我失望了
变量运算符“”_num(int val)
{返回变量(val);}
*/
int main()
{
自动树=op(添加“a”变量,op(mlt,变量(2),“b”变量));

cout您正在发明标准绑定机制。用户无需编写任何粘合代码

auto tree = bind(plus<int>(), ref(variables["a"]), bind(multiplies<int>(), 2, ref(variables["b"])));
cout << tree();
auto-tree=bind(加(),ref(变量[“a”]),bind(乘(),2,ref(变量[“b”]));

cout您正在发明标准绑定机制。用户无需编写任何粘合代码

auto tree = bind(plus<int>(), ref(variables["a"]), bind(multiplies<int>(), 2, ref(variables["b"])));
cout << tree();
auto-tree=bind(加(),ref(变量[“a”]),bind(乘(),2,ref(变量[“b”]));

那些
add
mlt
声明正确吗?
function
意味着它将返回一个接受整数的函数,并返回一个整数,而不是一个。呃,不正确。
function x
确实声明了一个接受两个整数并返回一个的函数对象。我的编译器上有一个错误,但是当我使用
auto
时,它会工作。这不是很有帮助,也不是很具体。那些
add
mlt
声明正确吗?
function
意味着它将返回一个接受整数的函数,并返回一个整数,而不是一个。呃,不。
function x
确实声明了一个接受整数的函数对象在我的编译器中,我得到了一个错误,但是我使用了<代码>自动<代码>。它不是很有帮助或是具体的。这是一个很好的耳光:-D谢谢。WHAY。这就是我的声音,用你的脸拍我的脸,用我的真谛,C++编码。是的,这就是我来这里的原因:-这不是等同于< C吗?ode>自动树=[&variables](){variables[“a”]+2*variables[“b”]当然,这会产生一个大的引用而不是两个特定的引用。@ MalSalt它有点远离原文。BIN示例仍然是一个表达式树。这是一个漂亮的耳光:-D谢谢。WHAY。这就是我的声音,用你的脸打耳光,用我的真谛,编码C++。是的,这就是我为什么来H的原因。ere:-)这不等于
自动树=[&variables](){variables[“a”]+2*variables[“b”];
?当然,这会创建一个大引用,而不是两个特定的引用。@msalter它与原始的有点不同。绑定示例仍然是一个表达式树。