1

我正在制作一个表达式类:

template<typename T, typename U>
class expression
{
public:
    expression(T vala, U valb, oper o){val1 = vala; val2 = valb; op = o;}
    operator bool{return(val1 op val2);}
private:
    T val1;
    U val2;
    oper op;
};

正如你所看到的,这有点伪代码,因为我需要一个操作符类。我最初的想法是创建一个包含所有可能的运算符的数组,然后通过字符串对其进行转换,但是由于运算符数量众多,以及如何将其转换为字符串,除了通过二维数组之外,这不起作用,其中 n[0][0] 具有第一个运算符,而 n[0][1] 具有该运算符字符串。

有人对向我的表达式类添加运算符值有任何建议吗?

4

4 回答 4

3

c++ 表达式模板技术中使用了类似的方法。

您可以使用 apply 或 evaluate 之类的方法将表达式创建为类。此方法接受参数并应用表达式。

看看使用了哪些表达式模板。 http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm https://www.cct.lsu.edu/~hkaiser/spring_2012/files/ExpressionTemplates-ToddVeldhuizen.pdf

作为你的例子:

struct isEqual
{
    template <typename T, typename U>
    bool operator()(T a, U b)
    {
        return a == b;
    }
};

template <typename T, typename OP>
struct expression
{
    T& a;
    T& b;
    OP& op;

    expression(T a, T b, OP op) : a(a), b(b), op(op) {}

    void eval() { op(a,b); }
};


int main()
{
    expression<int, isEqual> exp(1,2,isEqual());
    exp.eval();
}
于 2009-06-14T03:10:40.913 回答
2

也许是一个函数指针。代替 ...

operator bool{return(val1 op val2);}

...将其编码为...

operator bool{return op(val1, val2);}

...在这种情况下op,可以是指向(任何)函数的指针,该函数接受两个参数并返回 bool。

template<typename T, typename U>
class expression
{
public:
    //define pointer-to-function type
    typedef bool *oper(const T& val1, const U& val2);
    ... etc ...
于 2009-06-14T03:03:54.160 回答
1

我不完全确定您在问什么,但是如果您试图将任意字符串作为运算符重载,则不能。有一组有限的运算符可以在 C++ 中重载

见这里:http ://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

您应该做的是在 oper 中重载 operator() 以创建函数对象并返回 op(val1, val2) 。

于 2009-06-14T03:03:16.657 回答
1

您可以使用功能标准库并将您的论点作为:

std::tr1::function<bool (T,U)>

IE:

#include <functional>

template<typename T, typename U>
class expression
{
public:
   expression(T vala, U valb, oper o) : val1(vala), val2(valb), op(o)
   { }
   operator bool{return op(val1, val2);}
private:
   T val1;
   U val2;
   std::tr1::function<bool (T,U)> op;
};

然后,创建一个表达式:

#include <functional>

expression<int, int> foo(4,3, std::tr1::bind(greater()));

这是一个教程

于 2009-06-14T04:56:07.637 回答